From c465d13e6fca5e171bde45d35b2dd43117f4702e Mon Sep 17 00:00:00 2001 From: Hal Canary Date: Fri, 8 Dec 2017 10:21:31 -0500 Subject: resources: orgainize directory. Should make it easier to ask just for images. Change-Id: If821743dc924c4bfbc6b2b2d29b14affde7b3afd Reviewed-on: https://skia-review.googlesource.com/82684 Commit-Queue: Hal Canary Reviewed-by: Leon Scroggins --- resources/16x1.png | Bin 278 -> 0 bytes resources/1x1.png | Bin 277 -> 0 bytes resources/1x16.png | Bin 278 -> 0 bytes resources/1x3.png | Bin 278 -> 0 bytes resources/2x2.png | Bin 279 -> 0 bytes resources/3x1.png | Bin 277 -> 0 bytes resources/3x3.png | Bin 278 -> 0 bytes resources/CMYK.jpg | Bin 116536 -> 0 bytes resources/alphabetAnim.gif | Bin 1770 -> 0 bytes resources/arrow.png | Bin 3926 -> 0 bytes resources/baby_tux.png | Bin 29596 -> 0 bytes resources/baby_tux.webp | Bin 17128 -> 0 bytes resources/blendBG.webp | Bin 776 -> 0 bytes resources/box.gif | Bin 472 -> 0 bytes resources/brickwork-texture.jpg | Bin 155023 -> 0 bytes resources/brickwork_normal-map.jpg | Bin 180614 -> 0 bytes resources/colorTables.gif | Bin 2829 -> 0 bytes resources/color_wheel.gif | Bin 5008 -> 0 bytes resources/color_wheel.ico | Bin 99678 -> 0 bytes resources/color_wheel.jpg | Bin 8358 -> 0 bytes resources/color_wheel.png | Bin 9161 -> 0 bytes resources/color_wheel.webp | Bin 6810 -> 0 bytes resources/color_wheel_with_profile.png | Bin 11810 -> 0 bytes resources/cropped_mandrill.jpg | Bin 23220 -> 0 bytes resources/dng_with_preview.dng | Bin 138076 -> 0 bytes resources/dog.jpg | Bin 8504 -> 0 bytes resources/exif-orientation-2-ur.jpg | Bin 1948 -> 0 bytes resources/flutter_logo.jpg | Bin 12302 -> 0 bytes resources/gamut.png | Bin 479210 -> 0 bytes resources/google_chrome.ico | Bin 192708 -> 0 bytes resources/grayscale.jpg | Bin 770 -> 0 bytes resources/half-transparent-white-pixel.png | Bin 178 -> 0 bytes resources/half-transparent-white-pixel.webp | Bin 38 -> 0 bytes resources/icc-v2-gbr.jpg | Bin 43834 -> 0 bytes resources/iconstrip.png | Bin 55635 -> 0 bytes resources/images/16x1.png | Bin 0 -> 278 bytes resources/images/1x1.png | Bin 0 -> 277 bytes resources/images/1x16.png | Bin 0 -> 278 bytes resources/images/1x3.png | Bin 0 -> 278 bytes resources/images/2x2.png | Bin 0 -> 279 bytes resources/images/3x1.png | Bin 0 -> 277 bytes resources/images/3x3.png | Bin 0 -> 278 bytes resources/images/CMYK.jpg | Bin 0 -> 116536 bytes resources/images/alphabetAnim.gif | Bin 0 -> 1770 bytes resources/images/arrow.png | Bin 0 -> 3926 bytes resources/images/baby_tux.png | Bin 0 -> 29596 bytes resources/images/baby_tux.webp | Bin 0 -> 17128 bytes resources/images/blendBG.webp | Bin 0 -> 776 bytes resources/images/box.gif | Bin 0 -> 472 bytes resources/images/brickwork-texture.jpg | Bin 0 -> 155023 bytes resources/images/brickwork_normal-map.jpg | Bin 0 -> 180614 bytes resources/images/colorTables.gif | Bin 0 -> 2829 bytes resources/images/color_wheel.gif | Bin 0 -> 5008 bytes resources/images/color_wheel.ico | Bin 0 -> 99678 bytes resources/images/color_wheel.jpg | Bin 0 -> 8358 bytes resources/images/color_wheel.png | Bin 0 -> 9161 bytes resources/images/color_wheel.webp | Bin 0 -> 6810 bytes resources/images/color_wheel_with_profile.png | Bin 0 -> 11810 bytes resources/images/cropped_mandrill.jpg | Bin 0 -> 23220 bytes resources/images/dng_with_preview.dng | Bin 0 -> 138076 bytes resources/images/dog.jpg | Bin 0 -> 8504 bytes resources/images/exif-orientation-2-ur.jpg | Bin 0 -> 1948 bytes resources/images/flutter_logo.jpg | Bin 0 -> 12302 bytes resources/images/gamut.png | Bin 0 -> 479210 bytes resources/images/google_chrome.ico | Bin 0 -> 192708 bytes resources/images/grayscale.jpg | Bin 0 -> 770 bytes resources/images/half-transparent-white-pixel.png | Bin 0 -> 178 bytes resources/images/half-transparent-white-pixel.webp | Bin 0 -> 38 bytes resources/images/icc-v2-gbr.jpg | Bin 0 -> 43834 bytes resources/images/iconstrip.png | Bin 0 -> 55635 bytes resources/images/index8.png | Bin 0 -> 13418 bytes resources/images/mandrill.wbmp | Bin 0 -> 32774 bytes resources/images/mandrill_128.png | Bin 0 -> 38054 bytes resources/images/mandrill_16.png | Bin 0 -> 952 bytes resources/images/mandrill_256.png | Bin 0 -> 153549 bytes resources/images/mandrill_32.png | Bin 0 -> 2675 bytes resources/images/mandrill_512.png | Bin 0 -> 625834 bytes resources/images/mandrill_512_q075.jpg | Bin 0 -> 77244 bytes resources/images/mandrill_64.png | Bin 0 -> 9601 bytes resources/images/mandrill_h1v1.jpg | Bin 0 -> 88253 bytes resources/images/mandrill_h2v1.jpg | Bin 0 -> 81700 bytes resources/images/plane.png | Bin 0 -> 5718 bytes resources/images/plane_interlaced.png | Bin 0 -> 6451 bytes resources/images/rainbow-gradient.png | Bin 0 -> 2592 bytes resources/images/randPixels.bmp | Bin 0 -> 246 bytes resources/images/randPixels.gif | Bin 0 -> 277 bytes resources/images/randPixels.jpg | Bin 0 -> 329 bytes resources/images/randPixels.png | Bin 0 -> 268 bytes resources/images/randPixels.webp | Bin 0 -> 308 bytes resources/images/randPixelsAnim.gif | Bin 0 -> 1225 bytes resources/images/randPixelsAnim2.gif | Bin 0 -> 514 bytes resources/images/randPixelsOffset.gif | Bin 0 -> 277 bytes resources/images/required.gif | Bin 0 -> 733 bytes resources/images/required.webp | Bin 0 -> 788 bytes resources/images/rle.bmp | Bin 0 -> 40400 bytes resources/images/sample_1mp.dng | Bin 0 -> 87116 bytes resources/images/sample_1mp_rotated.dng | Bin 0 -> 87460 bytes resources/images/shadowreference.png | Bin 0 -> 10373 bytes resources/images/ship.png | Bin 0 -> 16218 bytes resources/images/test640x479.gif | Bin 0 -> 73823 bytes resources/images/webp-animated.webp | Bin 0 -> 340 bytes resources/images/webp-color-profile-crash.webp | Bin 0 -> 35882 bytes resources/images/webp-color-profile-lossless.webp | Bin 0 -> 43866 bytes .../images/webp-color-profile-lossy-alpha.webp | Bin 0 -> 16018 bytes resources/images/webp-color-profile-lossy.webp | Bin 0 -> 19436 bytes resources/images/yellow_rose.png | Bin 0 -> 121363 bytes resources/images/yellow_rose.webp | Bin 0 -> 23404 bytes resources/index8.png | Bin 13418 -> 0 bytes resources/lua/slides.lua | 356 +++++++++++++++++++++ resources/lua/slides_content.lua | 94 ++++++ resources/lua/slides_content2.lua | 123 +++++++ resources/lua/slides_transitions.lua | 208 ++++++++++++ resources/lua/slides_utils.lua | 102 ++++++ resources/lua/test.lua | 76 +++++ resources/mandrill.wbmp | Bin 32774 -> 0 bytes resources/mandrill_128.png | Bin 38054 -> 0 bytes resources/mandrill_16.png | Bin 952 -> 0 bytes resources/mandrill_256.png | Bin 153549 -> 0 bytes resources/mandrill_32.png | Bin 2675 -> 0 bytes resources/mandrill_512.png | Bin 625834 -> 0 bytes resources/mandrill_512_q075.jpg | Bin 77244 -> 0 bytes resources/mandrill_64.png | Bin 9601 -> 0 bytes resources/mandrill_h1v1.jpg | Bin 88253 -> 0 bytes resources/mandrill_h2v1.jpg | Bin 81700 -> 0 bytes resources/plane.png | Bin 5718 -> 0 bytes resources/plane_interlaced.png | Bin 6451 -> 0 bytes resources/rainbow-gradient.png | Bin 2592 -> 0 bytes resources/randPixels.bmp | Bin 246 -> 0 bytes resources/randPixels.gif | Bin 277 -> 0 bytes resources/randPixels.jpg | Bin 329 -> 0 bytes resources/randPixels.png | Bin 268 -> 0 bytes resources/randPixels.webp | Bin 308 -> 0 bytes resources/randPixelsAnim.gif | Bin 1225 -> 0 bytes resources/randPixelsAnim2.gif | Bin 514 -> 0 bytes resources/randPixelsOffset.gif | Bin 277 -> 0 bytes resources/required.gif | Bin 733 -> 0 bytes resources/required.webp | Bin 788 -> 0 bytes resources/rle.bmp | Bin 40400 -> 0 bytes resources/sample_1mp.dng | Bin 87116 -> 0 bytes resources/sample_1mp_rotated.dng | Bin 87460 -> 0 bytes resources/shadowreference.png | Bin 10373 -> 0 bytes resources/ship.png | Bin 16218 -> 0 bytes resources/slides.lua | 356 --------------------- resources/slides_content.lua | 94 ------ resources/slides_content2.lua | 123 ------- resources/slides_transitions.lua | 208 ------------ resources/slides_utils.lua | 102 ------ resources/test.lua | 76 ----- resources/test640x479.gif | Bin 73823 -> 0 bytes resources/webp-animated.webp | Bin 340 -> 0 bytes resources/webp-color-profile-crash.webp | Bin 35882 -> 0 bytes resources/webp-color-profile-lossless.webp | Bin 43866 -> 0 bytes resources/webp-color-profile-lossy-alpha.webp | Bin 16018 -> 0 bytes resources/webp-color-profile-lossy.webp | Bin 19436 -> 0 bytes resources/yellow_rose.png | Bin 121363 -> 0 bytes resources/yellow_rose.webp | Bin 23404 -> 0 bytes 156 files changed, 959 insertions(+), 959 deletions(-) delete mode 100644 resources/16x1.png delete mode 100644 resources/1x1.png delete mode 100644 resources/1x16.png delete mode 100644 resources/1x3.png delete mode 100644 resources/2x2.png delete mode 100644 resources/3x1.png delete mode 100644 resources/3x3.png delete mode 100644 resources/CMYK.jpg delete mode 100644 resources/alphabetAnim.gif delete mode 100644 resources/arrow.png delete mode 100644 resources/baby_tux.png delete mode 100644 resources/baby_tux.webp delete mode 100644 resources/blendBG.webp delete mode 100644 resources/box.gif delete mode 100644 resources/brickwork-texture.jpg delete mode 100644 resources/brickwork_normal-map.jpg delete mode 100644 resources/colorTables.gif delete mode 100644 resources/color_wheel.gif delete mode 100644 resources/color_wheel.ico delete mode 100644 resources/color_wheel.jpg delete mode 100644 resources/color_wheel.png delete mode 100644 resources/color_wheel.webp delete mode 100644 resources/color_wheel_with_profile.png delete mode 100644 resources/cropped_mandrill.jpg delete mode 100644 resources/dng_with_preview.dng delete mode 100644 resources/dog.jpg delete mode 100644 resources/exif-orientation-2-ur.jpg delete mode 100644 resources/flutter_logo.jpg delete mode 100644 resources/gamut.png delete mode 100644 resources/google_chrome.ico delete mode 100644 resources/grayscale.jpg delete mode 100644 resources/half-transparent-white-pixel.png delete mode 100644 resources/half-transparent-white-pixel.webp delete mode 100644 resources/icc-v2-gbr.jpg delete mode 100644 resources/iconstrip.png create mode 100644 resources/images/16x1.png create mode 100644 resources/images/1x1.png create mode 100644 resources/images/1x16.png create mode 100644 resources/images/1x3.png create mode 100644 resources/images/2x2.png create mode 100644 resources/images/3x1.png create mode 100644 resources/images/3x3.png create mode 100644 resources/images/CMYK.jpg create mode 100644 resources/images/alphabetAnim.gif create mode 100644 resources/images/arrow.png create mode 100644 resources/images/baby_tux.png create mode 100644 resources/images/baby_tux.webp create mode 100644 resources/images/blendBG.webp create mode 100644 resources/images/box.gif create mode 100644 resources/images/brickwork-texture.jpg create mode 100644 resources/images/brickwork_normal-map.jpg create mode 100644 resources/images/colorTables.gif create mode 100644 resources/images/color_wheel.gif create mode 100644 resources/images/color_wheel.ico create mode 100644 resources/images/color_wheel.jpg create mode 100644 resources/images/color_wheel.png create mode 100644 resources/images/color_wheel.webp create mode 100644 resources/images/color_wheel_with_profile.png create mode 100644 resources/images/cropped_mandrill.jpg create mode 100644 resources/images/dng_with_preview.dng create mode 100644 resources/images/dog.jpg create mode 100644 resources/images/exif-orientation-2-ur.jpg create mode 100644 resources/images/flutter_logo.jpg create mode 100644 resources/images/gamut.png create mode 100644 resources/images/google_chrome.ico create mode 100644 resources/images/grayscale.jpg create mode 100644 resources/images/half-transparent-white-pixel.png create mode 100644 resources/images/half-transparent-white-pixel.webp create mode 100644 resources/images/icc-v2-gbr.jpg create mode 100644 resources/images/iconstrip.png create mode 100644 resources/images/index8.png create mode 100644 resources/images/mandrill.wbmp create mode 100644 resources/images/mandrill_128.png create mode 100644 resources/images/mandrill_16.png create mode 100644 resources/images/mandrill_256.png create mode 100644 resources/images/mandrill_32.png create mode 100644 resources/images/mandrill_512.png create mode 100644 resources/images/mandrill_512_q075.jpg create mode 100644 resources/images/mandrill_64.png create mode 100644 resources/images/mandrill_h1v1.jpg create mode 100644 resources/images/mandrill_h2v1.jpg create mode 100644 resources/images/plane.png create mode 100644 resources/images/plane_interlaced.png create mode 100644 resources/images/rainbow-gradient.png create mode 100644 resources/images/randPixels.bmp create mode 100644 resources/images/randPixels.gif create mode 100644 resources/images/randPixels.jpg create mode 100644 resources/images/randPixels.png create mode 100644 resources/images/randPixels.webp create mode 100644 resources/images/randPixelsAnim.gif create mode 100644 resources/images/randPixelsAnim2.gif create mode 100644 resources/images/randPixelsOffset.gif create mode 100644 resources/images/required.gif create mode 100644 resources/images/required.webp create mode 100644 resources/images/rle.bmp create mode 100644 resources/images/sample_1mp.dng create mode 100644 resources/images/sample_1mp_rotated.dng create mode 100644 resources/images/shadowreference.png create mode 100644 resources/images/ship.png create mode 100644 resources/images/test640x479.gif create mode 100644 resources/images/webp-animated.webp create mode 100644 resources/images/webp-color-profile-crash.webp create mode 100644 resources/images/webp-color-profile-lossless.webp create mode 100644 resources/images/webp-color-profile-lossy-alpha.webp create mode 100644 resources/images/webp-color-profile-lossy.webp create mode 100644 resources/images/yellow_rose.png create mode 100644 resources/images/yellow_rose.webp delete mode 100644 resources/index8.png create mode 100644 resources/lua/slides.lua create mode 100644 resources/lua/slides_content.lua create mode 100644 resources/lua/slides_content2.lua create mode 100644 resources/lua/slides_transitions.lua create mode 100644 resources/lua/slides_utils.lua create mode 100644 resources/lua/test.lua delete mode 100644 resources/mandrill.wbmp delete mode 100644 resources/mandrill_128.png delete mode 100644 resources/mandrill_16.png delete mode 100644 resources/mandrill_256.png delete mode 100644 resources/mandrill_32.png delete mode 100644 resources/mandrill_512.png delete mode 100644 resources/mandrill_512_q075.jpg delete mode 100644 resources/mandrill_64.png delete mode 100644 resources/mandrill_h1v1.jpg delete mode 100644 resources/mandrill_h2v1.jpg delete mode 100644 resources/plane.png delete mode 100644 resources/plane_interlaced.png delete mode 100644 resources/rainbow-gradient.png delete mode 100644 resources/randPixels.bmp delete mode 100644 resources/randPixels.gif delete mode 100644 resources/randPixels.jpg delete mode 100644 resources/randPixels.png delete mode 100644 resources/randPixels.webp delete mode 100644 resources/randPixelsAnim.gif delete mode 100644 resources/randPixelsAnim2.gif delete mode 100644 resources/randPixelsOffset.gif delete mode 100644 resources/required.gif delete mode 100644 resources/required.webp delete mode 100644 resources/rle.bmp delete mode 100644 resources/sample_1mp.dng delete mode 100644 resources/sample_1mp_rotated.dng delete mode 100755 resources/shadowreference.png delete mode 100755 resources/ship.png delete mode 100644 resources/slides.lua delete mode 100644 resources/slides_content.lua delete mode 100644 resources/slides_content2.lua delete mode 100644 resources/slides_transitions.lua delete mode 100644 resources/slides_utils.lua delete mode 100644 resources/test.lua delete mode 100644 resources/test640x479.gif delete mode 100755 resources/webp-animated.webp delete mode 100644 resources/webp-color-profile-crash.webp delete mode 100644 resources/webp-color-profile-lossless.webp delete mode 100644 resources/webp-color-profile-lossy-alpha.webp delete mode 100644 resources/webp-color-profile-lossy.webp delete mode 100644 resources/yellow_rose.png delete mode 100644 resources/yellow_rose.webp (limited to 'resources') diff --git a/resources/16x1.png b/resources/16x1.png deleted file mode 100644 index 03edc41bc5..0000000000 Binary files a/resources/16x1.png and /dev/null differ diff --git a/resources/1x1.png b/resources/1x1.png deleted file mode 100644 index e4bc98dd1a..0000000000 Binary files a/resources/1x1.png and /dev/null differ diff --git a/resources/1x16.png b/resources/1x16.png deleted file mode 100644 index d3d6548522..0000000000 Binary files a/resources/1x16.png and /dev/null differ diff --git a/resources/1x3.png b/resources/1x3.png deleted file mode 100644 index e4ee2f0837..0000000000 Binary files a/resources/1x3.png and /dev/null differ diff --git a/resources/2x2.png b/resources/2x2.png deleted file mode 100644 index a933e7a39b..0000000000 Binary files a/resources/2x2.png and /dev/null differ diff --git a/resources/3x1.png b/resources/3x1.png deleted file mode 100644 index c7e4cb07a6..0000000000 Binary files a/resources/3x1.png and /dev/null differ diff --git a/resources/3x3.png b/resources/3x3.png deleted file mode 100644 index a2acb64cae..0000000000 Binary files a/resources/3x3.png and /dev/null differ diff --git a/resources/CMYK.jpg b/resources/CMYK.jpg deleted file mode 100644 index 04ed9859dd..0000000000 Binary files a/resources/CMYK.jpg and /dev/null differ diff --git a/resources/alphabetAnim.gif b/resources/alphabetAnim.gif deleted file mode 100644 index d6b7d85b0e..0000000000 Binary files a/resources/alphabetAnim.gif and /dev/null differ diff --git a/resources/arrow.png b/resources/arrow.png deleted file mode 100644 index 382ef39040..0000000000 Binary files a/resources/arrow.png and /dev/null differ diff --git a/resources/baby_tux.png b/resources/baby_tux.png deleted file mode 100644 index dd082c4e2c..0000000000 Binary files a/resources/baby_tux.png and /dev/null differ diff --git a/resources/baby_tux.webp b/resources/baby_tux.webp deleted file mode 100644 index 8764f066b9..0000000000 Binary files a/resources/baby_tux.webp and /dev/null differ diff --git a/resources/blendBG.webp b/resources/blendBG.webp deleted file mode 100644 index 46e4ce255d..0000000000 Binary files a/resources/blendBG.webp and /dev/null differ diff --git a/resources/box.gif b/resources/box.gif deleted file mode 100644 index 72884ce484..0000000000 Binary files a/resources/box.gif and /dev/null differ diff --git a/resources/brickwork-texture.jpg b/resources/brickwork-texture.jpg deleted file mode 100644 index 9a7dd11788..0000000000 Binary files a/resources/brickwork-texture.jpg and /dev/null differ diff --git a/resources/brickwork_normal-map.jpg b/resources/brickwork_normal-map.jpg deleted file mode 100644 index 4ff3c3a34e..0000000000 Binary files a/resources/brickwork_normal-map.jpg and /dev/null differ diff --git a/resources/colorTables.gif b/resources/colorTables.gif deleted file mode 100644 index cefd4120dd..0000000000 Binary files a/resources/colorTables.gif and /dev/null differ diff --git a/resources/color_wheel.gif b/resources/color_wheel.gif deleted file mode 100644 index ec9005001e..0000000000 Binary files a/resources/color_wheel.gif and /dev/null differ diff --git a/resources/color_wheel.ico b/resources/color_wheel.ico deleted file mode 100644 index fdfa381c1a..0000000000 Binary files a/resources/color_wheel.ico and /dev/null differ diff --git a/resources/color_wheel.jpg b/resources/color_wheel.jpg deleted file mode 100644 index fc2cea9d4e..0000000000 Binary files a/resources/color_wheel.jpg and /dev/null differ diff --git a/resources/color_wheel.png b/resources/color_wheel.png deleted file mode 100644 index 02f4e08453..0000000000 Binary files a/resources/color_wheel.png and /dev/null differ diff --git a/resources/color_wheel.webp b/resources/color_wheel.webp deleted file mode 100644 index 6466d4bbb5..0000000000 Binary files a/resources/color_wheel.webp and /dev/null differ diff --git a/resources/color_wheel_with_profile.png b/resources/color_wheel_with_profile.png deleted file mode 100644 index 56f2385c53..0000000000 Binary files a/resources/color_wheel_with_profile.png and /dev/null differ diff --git a/resources/cropped_mandrill.jpg b/resources/cropped_mandrill.jpg deleted file mode 100644 index e1a233ad35..0000000000 Binary files a/resources/cropped_mandrill.jpg and /dev/null differ diff --git a/resources/dng_with_preview.dng b/resources/dng_with_preview.dng deleted file mode 100644 index eb13160363..0000000000 Binary files a/resources/dng_with_preview.dng and /dev/null differ diff --git a/resources/dog.jpg b/resources/dog.jpg deleted file mode 100644 index 2598ecb8b7..0000000000 Binary files a/resources/dog.jpg and /dev/null differ diff --git a/resources/exif-orientation-2-ur.jpg b/resources/exif-orientation-2-ur.jpg deleted file mode 100644 index 70c14d4272..0000000000 Binary files a/resources/exif-orientation-2-ur.jpg and /dev/null differ diff --git a/resources/flutter_logo.jpg b/resources/flutter_logo.jpg deleted file mode 100644 index f049c22506..0000000000 Binary files a/resources/flutter_logo.jpg and /dev/null differ diff --git a/resources/gamut.png b/resources/gamut.png deleted file mode 100644 index 7e3782b3f6..0000000000 Binary files a/resources/gamut.png and /dev/null differ diff --git a/resources/google_chrome.ico b/resources/google_chrome.ico deleted file mode 100644 index 7af91eed00..0000000000 Binary files a/resources/google_chrome.ico and /dev/null differ diff --git a/resources/grayscale.jpg b/resources/grayscale.jpg deleted file mode 100644 index 6c6ae32c91..0000000000 Binary files a/resources/grayscale.jpg and /dev/null differ diff --git a/resources/half-transparent-white-pixel.png b/resources/half-transparent-white-pixel.png deleted file mode 100644 index 03565d35c1..0000000000 Binary files a/resources/half-transparent-white-pixel.png and /dev/null differ diff --git a/resources/half-transparent-white-pixel.webp b/resources/half-transparent-white-pixel.webp deleted file mode 100644 index b3a3307211..0000000000 Binary files a/resources/half-transparent-white-pixel.webp and /dev/null differ diff --git a/resources/icc-v2-gbr.jpg b/resources/icc-v2-gbr.jpg deleted file mode 100644 index 0984e9b3fd..0000000000 Binary files a/resources/icc-v2-gbr.jpg and /dev/null differ diff --git a/resources/iconstrip.png b/resources/iconstrip.png deleted file mode 100644 index 10be277afd..0000000000 Binary files a/resources/iconstrip.png and /dev/null differ diff --git a/resources/images/16x1.png b/resources/images/16x1.png new file mode 100644 index 0000000000..03edc41bc5 Binary files /dev/null and b/resources/images/16x1.png differ diff --git a/resources/images/1x1.png b/resources/images/1x1.png new file mode 100644 index 0000000000..e4bc98dd1a Binary files /dev/null and b/resources/images/1x1.png differ diff --git a/resources/images/1x16.png b/resources/images/1x16.png new file mode 100644 index 0000000000..d3d6548522 Binary files /dev/null and b/resources/images/1x16.png differ diff --git a/resources/images/1x3.png b/resources/images/1x3.png new file mode 100644 index 0000000000..e4ee2f0837 Binary files /dev/null and b/resources/images/1x3.png differ diff --git a/resources/images/2x2.png b/resources/images/2x2.png new file mode 100644 index 0000000000..a933e7a39b Binary files /dev/null and b/resources/images/2x2.png differ diff --git a/resources/images/3x1.png b/resources/images/3x1.png new file mode 100644 index 0000000000..c7e4cb07a6 Binary files /dev/null and b/resources/images/3x1.png differ diff --git a/resources/images/3x3.png b/resources/images/3x3.png new file mode 100644 index 0000000000..a2acb64cae Binary files /dev/null and b/resources/images/3x3.png differ diff --git a/resources/images/CMYK.jpg b/resources/images/CMYK.jpg new file mode 100644 index 0000000000..04ed9859dd Binary files /dev/null and b/resources/images/CMYK.jpg differ diff --git a/resources/images/alphabetAnim.gif b/resources/images/alphabetAnim.gif new file mode 100644 index 0000000000..d6b7d85b0e Binary files /dev/null and b/resources/images/alphabetAnim.gif differ diff --git a/resources/images/arrow.png b/resources/images/arrow.png new file mode 100644 index 0000000000..382ef39040 Binary files /dev/null and b/resources/images/arrow.png differ diff --git a/resources/images/baby_tux.png b/resources/images/baby_tux.png new file mode 100644 index 0000000000..dd082c4e2c Binary files /dev/null and b/resources/images/baby_tux.png differ diff --git a/resources/images/baby_tux.webp b/resources/images/baby_tux.webp new file mode 100644 index 0000000000..8764f066b9 Binary files /dev/null and b/resources/images/baby_tux.webp differ diff --git a/resources/images/blendBG.webp b/resources/images/blendBG.webp new file mode 100644 index 0000000000..46e4ce255d Binary files /dev/null and b/resources/images/blendBG.webp differ diff --git a/resources/images/box.gif b/resources/images/box.gif new file mode 100644 index 0000000000..72884ce484 Binary files /dev/null and b/resources/images/box.gif differ diff --git a/resources/images/brickwork-texture.jpg b/resources/images/brickwork-texture.jpg new file mode 100644 index 0000000000..9a7dd11788 Binary files /dev/null and b/resources/images/brickwork-texture.jpg differ diff --git a/resources/images/brickwork_normal-map.jpg b/resources/images/brickwork_normal-map.jpg new file mode 100644 index 0000000000..4ff3c3a34e Binary files /dev/null and b/resources/images/brickwork_normal-map.jpg differ diff --git a/resources/images/colorTables.gif b/resources/images/colorTables.gif new file mode 100644 index 0000000000..cefd4120dd Binary files /dev/null and b/resources/images/colorTables.gif differ diff --git a/resources/images/color_wheel.gif b/resources/images/color_wheel.gif new file mode 100644 index 0000000000..ec9005001e Binary files /dev/null and b/resources/images/color_wheel.gif differ diff --git a/resources/images/color_wheel.ico b/resources/images/color_wheel.ico new file mode 100644 index 0000000000..fdfa381c1a Binary files /dev/null and b/resources/images/color_wheel.ico differ diff --git a/resources/images/color_wheel.jpg b/resources/images/color_wheel.jpg new file mode 100644 index 0000000000..fc2cea9d4e Binary files /dev/null and b/resources/images/color_wheel.jpg differ diff --git a/resources/images/color_wheel.png b/resources/images/color_wheel.png new file mode 100644 index 0000000000..02f4e08453 Binary files /dev/null and b/resources/images/color_wheel.png differ diff --git a/resources/images/color_wheel.webp b/resources/images/color_wheel.webp new file mode 100644 index 0000000000..6466d4bbb5 Binary files /dev/null and b/resources/images/color_wheel.webp differ diff --git a/resources/images/color_wheel_with_profile.png b/resources/images/color_wheel_with_profile.png new file mode 100644 index 0000000000..56f2385c53 Binary files /dev/null and b/resources/images/color_wheel_with_profile.png differ diff --git a/resources/images/cropped_mandrill.jpg b/resources/images/cropped_mandrill.jpg new file mode 100644 index 0000000000..e1a233ad35 Binary files /dev/null and b/resources/images/cropped_mandrill.jpg differ diff --git a/resources/images/dng_with_preview.dng b/resources/images/dng_with_preview.dng new file mode 100644 index 0000000000..eb13160363 Binary files /dev/null and b/resources/images/dng_with_preview.dng differ diff --git a/resources/images/dog.jpg b/resources/images/dog.jpg new file mode 100644 index 0000000000..2598ecb8b7 Binary files /dev/null and b/resources/images/dog.jpg differ diff --git a/resources/images/exif-orientation-2-ur.jpg b/resources/images/exif-orientation-2-ur.jpg new file mode 100644 index 0000000000..70c14d4272 Binary files /dev/null and b/resources/images/exif-orientation-2-ur.jpg differ diff --git a/resources/images/flutter_logo.jpg b/resources/images/flutter_logo.jpg new file mode 100644 index 0000000000..f049c22506 Binary files /dev/null and b/resources/images/flutter_logo.jpg differ diff --git a/resources/images/gamut.png b/resources/images/gamut.png new file mode 100644 index 0000000000..7e3782b3f6 Binary files /dev/null and b/resources/images/gamut.png differ diff --git a/resources/images/google_chrome.ico b/resources/images/google_chrome.ico new file mode 100644 index 0000000000..7af91eed00 Binary files /dev/null and b/resources/images/google_chrome.ico differ diff --git a/resources/images/grayscale.jpg b/resources/images/grayscale.jpg new file mode 100644 index 0000000000..6c6ae32c91 Binary files /dev/null and b/resources/images/grayscale.jpg differ diff --git a/resources/images/half-transparent-white-pixel.png b/resources/images/half-transparent-white-pixel.png new file mode 100644 index 0000000000..03565d35c1 Binary files /dev/null and b/resources/images/half-transparent-white-pixel.png differ diff --git a/resources/images/half-transparent-white-pixel.webp b/resources/images/half-transparent-white-pixel.webp new file mode 100644 index 0000000000..b3a3307211 Binary files /dev/null and b/resources/images/half-transparent-white-pixel.webp differ diff --git a/resources/images/icc-v2-gbr.jpg b/resources/images/icc-v2-gbr.jpg new file mode 100644 index 0000000000..0984e9b3fd Binary files /dev/null and b/resources/images/icc-v2-gbr.jpg differ diff --git a/resources/images/iconstrip.png b/resources/images/iconstrip.png new file mode 100644 index 0000000000..10be277afd Binary files /dev/null and b/resources/images/iconstrip.png differ diff --git a/resources/images/index8.png b/resources/images/index8.png new file mode 100644 index 0000000000..2ff47a3bf4 Binary files /dev/null and b/resources/images/index8.png differ diff --git a/resources/images/mandrill.wbmp b/resources/images/mandrill.wbmp new file mode 100644 index 0000000000..ac84598cf0 Binary files /dev/null and b/resources/images/mandrill.wbmp differ diff --git a/resources/images/mandrill_128.png b/resources/images/mandrill_128.png new file mode 100644 index 0000000000..32f163773f Binary files /dev/null and b/resources/images/mandrill_128.png differ diff --git a/resources/images/mandrill_16.png b/resources/images/mandrill_16.png new file mode 100644 index 0000000000..e5703f52d6 Binary files /dev/null and b/resources/images/mandrill_16.png differ diff --git a/resources/images/mandrill_256.png b/resources/images/mandrill_256.png new file mode 100644 index 0000000000..0c6908424b Binary files /dev/null and b/resources/images/mandrill_256.png differ diff --git a/resources/images/mandrill_32.png b/resources/images/mandrill_32.png new file mode 100644 index 0000000000..c30e451d90 Binary files /dev/null and b/resources/images/mandrill_32.png differ diff --git a/resources/images/mandrill_512.png b/resources/images/mandrill_512.png new file mode 100644 index 0000000000..c2efb8108d Binary files /dev/null and b/resources/images/mandrill_512.png differ diff --git a/resources/images/mandrill_512_q075.jpg b/resources/images/mandrill_512_q075.jpg new file mode 100644 index 0000000000..c2c215f2e9 Binary files /dev/null and b/resources/images/mandrill_512_q075.jpg differ diff --git a/resources/images/mandrill_64.png b/resources/images/mandrill_64.png new file mode 100644 index 0000000000..d2e94cc891 Binary files /dev/null and b/resources/images/mandrill_64.png differ diff --git a/resources/images/mandrill_h1v1.jpg b/resources/images/mandrill_h1v1.jpg new file mode 100644 index 0000000000..388236d21a Binary files /dev/null and b/resources/images/mandrill_h1v1.jpg differ diff --git a/resources/images/mandrill_h2v1.jpg b/resources/images/mandrill_h2v1.jpg new file mode 100644 index 0000000000..573888a40f Binary files /dev/null and b/resources/images/mandrill_h2v1.jpg differ diff --git a/resources/images/plane.png b/resources/images/plane.png new file mode 100644 index 0000000000..03585b5cb4 Binary files /dev/null and b/resources/images/plane.png differ diff --git a/resources/images/plane_interlaced.png b/resources/images/plane_interlaced.png new file mode 100644 index 0000000000..3b217f205d Binary files /dev/null and b/resources/images/plane_interlaced.png differ diff --git a/resources/images/rainbow-gradient.png b/resources/images/rainbow-gradient.png new file mode 100644 index 0000000000..4e18a32716 Binary files /dev/null and b/resources/images/rainbow-gradient.png differ diff --git a/resources/images/randPixels.bmp b/resources/images/randPixels.bmp new file mode 100644 index 0000000000..1e4ab3b652 Binary files /dev/null and b/resources/images/randPixels.bmp differ diff --git a/resources/images/randPixels.gif b/resources/images/randPixels.gif new file mode 100644 index 0000000000..04c8bb9c3a Binary files /dev/null and b/resources/images/randPixels.gif differ diff --git a/resources/images/randPixels.jpg b/resources/images/randPixels.jpg new file mode 100644 index 0000000000..ca57fbddf3 Binary files /dev/null and b/resources/images/randPixels.jpg differ diff --git a/resources/images/randPixels.png b/resources/images/randPixels.png new file mode 100644 index 0000000000..49ef84603f Binary files /dev/null and b/resources/images/randPixels.png differ diff --git a/resources/images/randPixels.webp b/resources/images/randPixels.webp new file mode 100644 index 0000000000..135441e541 Binary files /dev/null and b/resources/images/randPixels.webp differ diff --git a/resources/images/randPixelsAnim.gif b/resources/images/randPixelsAnim.gif new file mode 100644 index 0000000000..7b12bfc6f6 Binary files /dev/null and b/resources/images/randPixelsAnim.gif differ diff --git a/resources/images/randPixelsAnim2.gif b/resources/images/randPixelsAnim2.gif new file mode 100644 index 0000000000..2b2b456155 Binary files /dev/null and b/resources/images/randPixelsAnim2.gif differ diff --git a/resources/images/randPixelsOffset.gif b/resources/images/randPixelsOffset.gif new file mode 100644 index 0000000000..df326b81f2 Binary files /dev/null and b/resources/images/randPixelsOffset.gif differ diff --git a/resources/images/required.gif b/resources/images/required.gif new file mode 100644 index 0000000000..91a9fd17e8 Binary files /dev/null and b/resources/images/required.gif differ diff --git a/resources/images/required.webp b/resources/images/required.webp new file mode 100644 index 0000000000..9f9a8f8b8d Binary files /dev/null and b/resources/images/required.webp differ diff --git a/resources/images/rle.bmp b/resources/images/rle.bmp new file mode 100644 index 0000000000..a08745fb2d Binary files /dev/null and b/resources/images/rle.bmp differ diff --git a/resources/images/sample_1mp.dng b/resources/images/sample_1mp.dng new file mode 100644 index 0000000000..c1c10787c7 Binary files /dev/null and b/resources/images/sample_1mp.dng differ diff --git a/resources/images/sample_1mp_rotated.dng b/resources/images/sample_1mp_rotated.dng new file mode 100644 index 0000000000..e0270abae1 Binary files /dev/null and b/resources/images/sample_1mp_rotated.dng differ diff --git a/resources/images/shadowreference.png b/resources/images/shadowreference.png new file mode 100644 index 0000000000..cca6fff645 Binary files /dev/null and b/resources/images/shadowreference.png differ diff --git a/resources/images/ship.png b/resources/images/ship.png new file mode 100644 index 0000000000..acb4fd4279 Binary files /dev/null and b/resources/images/ship.png differ diff --git a/resources/images/test640x479.gif b/resources/images/test640x479.gif new file mode 100644 index 0000000000..a17cb083bb Binary files /dev/null and b/resources/images/test640x479.gif differ diff --git a/resources/images/webp-animated.webp b/resources/images/webp-animated.webp new file mode 100644 index 0000000000..35a8dfcf34 Binary files /dev/null and b/resources/images/webp-animated.webp differ diff --git a/resources/images/webp-color-profile-crash.webp b/resources/images/webp-color-profile-crash.webp new file mode 100644 index 0000000000..3b0904e0f2 Binary files /dev/null and b/resources/images/webp-color-profile-crash.webp differ diff --git a/resources/images/webp-color-profile-lossless.webp b/resources/images/webp-color-profile-lossless.webp new file mode 100644 index 0000000000..4fd63d5794 Binary files /dev/null and b/resources/images/webp-color-profile-lossless.webp differ diff --git a/resources/images/webp-color-profile-lossy-alpha.webp b/resources/images/webp-color-profile-lossy-alpha.webp new file mode 100644 index 0000000000..1a13084e77 Binary files /dev/null and b/resources/images/webp-color-profile-lossy-alpha.webp differ diff --git a/resources/images/webp-color-profile-lossy.webp b/resources/images/webp-color-profile-lossy.webp new file mode 100644 index 0000000000..fdff0a9941 Binary files /dev/null and b/resources/images/webp-color-profile-lossy.webp differ diff --git a/resources/images/yellow_rose.png b/resources/images/yellow_rose.png new file mode 100644 index 0000000000..140c0b9c56 Binary files /dev/null and b/resources/images/yellow_rose.png differ diff --git a/resources/images/yellow_rose.webp b/resources/images/yellow_rose.webp new file mode 100644 index 0000000000..f7dc20839e Binary files /dev/null and b/resources/images/yellow_rose.webp differ diff --git a/resources/index8.png b/resources/index8.png deleted file mode 100644 index 2ff47a3bf4..0000000000 Binary files a/resources/index8.png and /dev/null differ diff --git a/resources/lua/slides.lua b/resources/lua/slides.lua new file mode 100644 index 0000000000..9d61a87273 --- /dev/null +++ b/resources/lua/slides.lua @@ -0,0 +1,356 @@ +gShowBounds = false +gUseBlurInTransitions = false + +gPath = "resources/" + +function load_file(file) + local prev_path = package.path + package.path = package.path .. ";" .. gPath .. file .. ".lua" + require(file) + package.path = prev_path +end + +load_file("slides_utils") + +gSlides = parse_file(io.open("resources/slides_content2.lua", "r")) + +function make_rect(l, t, r, b) + return { left = l, top = t, right = r, bottom = b } +end + +function make_paint(typefacename, style, size, color) + local paint = Sk.newPaint(); + paint:setAntiAlias(true) + paint:setSubpixelText(true) + paint:setTypeface(Sk.newTypeface(typefacename, style)) + paint:setTextSize(size) + paint:setColor(color) + return paint +end + +function draw_bullet(canvas, x, y, paint, indent) + if 0 == indent then + return + end + local ps = paint:getTextSize() + local cx = x - ps * .8 + local cy = y - ps * .4 + local radius = ps * .2 + canvas:drawCircle(cx, cy, radius, paint) +end + +function stroke_rect(canvas, rect, color) + local paint = Sk.newPaint() + paint:setStroke(true); + paint:setColor(color) + canvas:drawRect(rect, paint) +end + +function drawSlide(canvas, slide, master_template) + + if #slide == 1 then + template = master_template.title + canvas:drawText(slide[1].text, 320, 240, template[1]) + return + end + + template = master_template.slide + + local x = template.margin_x + local y = template.margin_y + local scale = 1.25 + + if slide.blockstyle == "code" then + local paint = master_template.codePaint + local fm = paint:getFontMetrics() + local height = #slide * (fm.descent - fm.ascent) + y = (480 - height) / 2 + for i = 1, #slide do + local node = slide[i] + y = y - fm.ascent * scale + canvas:drawText(node.text, x, y, paint) + y = y + fm.descent * scale + end + return + end + + for i = 1, #slide do + local node = slide[i] + local paint = template[node.indent + 1].paint + local extra_dy = template[node.indent + 1].extra_dy + local fm = paint:getFontMetrics() + local x_offset = -fm.ascent * node.indent * 1.25 + + local bounds = make_rect(x + x_offset, y, 620, 640) + local blob, newBottom = Sk.newTextBlob(node.text, bounds, paint) + draw_bullet(canvas, x + x_offset, y - fm.ascent, paint, node.indent) + canvas:drawTextBlob(blob, 0, 0, paint) + y = newBottom + paint:getTextSize() * .5 + extra_dy + + if gShowBounds then + bounds.bottom = newBottom + stroke_rect(canvas, bounds, {a=1,r=0,g=1,b=0}) + stroke_rect(canvas, blob:bounds(), {a=1,r=1,g=0,b=0}) + end + + end +end + +-------------------------------------------------------------------------------------- +function make_tmpl(paint, extra_dy) + return { paint = paint, extra_dy = extra_dy } +end + +function SkiaPoint_make_template() + normal = Sk.newFontStyle() + bold = Sk.newFontStyle(700) + local title = { + margin_x = 30, + margin_y = 100, + } + title[1] = make_paint("Arial", bold, 45, { a=1, r=1, g=1, b=1 }) + title[1]:setTextAlign("center") + title[2] = make_paint("Arial", bold, 25, { a=1, r=.75, g=.75, b=.75 }) + title[2]:setTextAlign("center") + + local slide = { + margin_x = 20, + margin_y = 25, + } + slide[1] = make_tmpl(make_paint("Arial", bold, 35, { a=1, r=1, g=1, b=1 }), 18) + slide[2] = make_tmpl(make_paint("Arial", normal, 25, { a=1, r=1, g=1, b=1 }), 10) + slide[3] = make_tmpl(make_paint("Arial", normal, 20, { a=1, r=.9, g=.9, b=.9 }), 5) + + return { + title = title, + slide = slide, + codePaint = make_paint("Courier", normal, 20, { a=1, r=.9, g=.9, b=.9 }), + } +end + +gTemplate = SkiaPoint_make_template() + +gRedPaint = Sk.newPaint() +gRedPaint:setAntiAlias(true) +gRedPaint:setColor{a=1, r=1, g=0, b=0 } + +-- animation.proc is passed the canvas before drawing. +-- The animation.proc returns itself or another animation (which means keep animating) +-- or it returns nil, which stops the animation. +-- +local gCurrAnimation + +gSlideIndex = 1 + +----------------------------------------------------------------------------- + +function new_drawable_picture(pic) + return { + picture = pic, + width = pic:width(), + height = pic:height(), + draw = function (self, canvas, x, y, paint) + canvas:drawPicture(self.picture, x, y, paint) + end + } +end + +function new_drawable_image(img) + return { + image = img, + width = img:width(), + height = img:height(), + draw = function (self, canvas, x, y, paint) + canvas:drawImage(self.image, x, y, paint) + end + } +end + +function convert_to_picture_drawable(slide) + local rec = Sk.newPictureRecorder() + drawSlide(rec:beginRecording(640, 480), slide, gTemplate) + return new_drawable_picture(rec:endRecording()) +end + +function convert_to_image_drawable(slide) + local surf = Sk.newRasterSurface(640, 480) + drawSlide(surf:getCanvas(), slide, gTemplate) + return new_drawable_image(surf:newImageSnapshot()) +end + +function new_drawable_slide(slide) + return { + slide = slide, + draw = function (self, canvas, x, y, paint) + if (nil == paint or ("number" == type(paint) and (1 == paint))) then + canvas:save() + else + canvas:saveLayer(paint) + end + canvas:translate(x, y) + drawSlide(canvas, self.slide, gTemplate) + canvas:restore() + end + } +end + +gNewDrawableFactory = { + default = new_drawable_slide, + picture = convert_to_picture_drawable, + image = convert_to_image_drawable, +} + +----------------------------------------------------------------------------- + +function next_slide() + local prev = gSlides[gSlideIndex] + + if gSlideIndex < #gSlides then + gSlideIndex = gSlideIndex + 1 + spawn_transition(prev, gSlides[gSlideIndex], true) + end +end + +function prev_slide() + local prev = gSlides[gSlideIndex] + + if gSlideIndex > 1 then + gSlideIndex = gSlideIndex - 1 + spawn_transition(prev, gSlides[gSlideIndex], false) + end +end + +gDrawableType = "default" + +load_file("slides_transitions") + +function spawn_transition(prevSlide, nextSlide, is_forward) + local transition + if is_forward then + transition = gTransitionTable[nextSlide.transition] + else + transition = gTransitionTable[prevSlide.transition] + end + + if not transition then + transition = fade_slide_transition + end + + local prevDrawable = gNewDrawableFactory[gDrawableType](prevSlide) + local nextDrawable = gNewDrawableFactory[gDrawableType](nextSlide) + gCurrAnimation = transition(prevDrawable, nextDrawable, is_forward) +end + +-------------------------------------------------------------------------------------- + +function spawn_rotate_animation() + gCurrAnimation = { + angle = 0, + angle_delta = 5, + pivot_x = 320, + pivot_y = 240, + proc = function (self, canvas, drawSlideProc) + if self.angle >= 360 then + drawSlideProc(canvas) + return nil + end + canvas:translate(self.pivot_x, self.pivot_y) + canvas:rotate(self.angle) + canvas:translate(-self.pivot_x, -self.pivot_y) + drawSlideProc(canvas) + + self.angle = self.angle + self.angle_delta + return self + end + } +end + +function spawn_scale_animation() + gCurrAnimation = { + scale = 1, + scale_delta = .95, + scale_limit = 0.2, + pivot_x = 320, + pivot_y = 240, + proc = function (self, canvas, drawSlideProc) + if self.scale < self.scale_limit then + self.scale = self.scale_limit + self.scale_delta = 1 / self.scale_delta + end + if self.scale > 1 then + drawSlideProc(canvas) + return nil + end + canvas:translate(self.pivot_x, self.pivot_y) + canvas:scale(self.scale, self.scale) + canvas:translate(-self.pivot_x, -self.pivot_y) + drawSlideProc(canvas) + + self.scale = self.scale * self.scale_delta + return self + end + } +end + +local bgPaint = nil + +function draw_bg(canvas) + if not bgPaint then + bgPaint = Sk.newPaint() + local grad = Sk.newLinearGradient( 0, 0, { a=1, r=0, g=0, b=.3 }, + 640, 480, { a=1, r=0, g=0, b=.8 }) + bgPaint:setShader(grad) + bgPaint:setDither(true) + end + + canvas:drawPaint(bgPaint) +end + +function onDrawContent(canvas, width, height) + local matrix = Sk.newMatrix() + matrix:setRectToRect(make_rect(0, 0, 640, 480), make_rect(0, 0, width, height), "center") + canvas:concat(matrix) + + draw_bg(canvas) + + local drawSlideProc = function(canvas) + drawSlide(canvas, gSlides[gSlideIndex], gTemplate) + end + + if gCurrAnimation then + gCurrAnimation = gCurrAnimation:proc(canvas, drawSlideProc) + return true + else + drawSlideProc(canvas) + return false + end +end + +function onClickHandler(x, y) + return false +end + +local keyProcs = { + n = next_slide, + p = prev_slide, + r = spawn_rotate_animation, + s = spawn_scale_animation, + ["="] = function () scale_text_delta(gTemplate, 1) end, + ["-"] = function () scale_text_delta(gTemplate, -1) end, + + b = function () gShowBounds = not gShowBounds end, + B = function () gUseBlurInTransitions = not gUseBlurInTransitions end, + + ["1"] = function () gDrawableType = "default" end, + ["2"] = function () gDrawableType = "picture" end, + ["3"] = function () gDrawableType = "image" end, +} + +function onCharHandler(uni) + local proc = keyProcs[uni] + if proc then + proc() + return true + end + return false +end diff --git a/resources/lua/slides_content.lua b/resources/lua/slides_content.lua new file mode 100644 index 0000000000..9b20e43c6b --- /dev/null +++ b/resources/lua/slides_content.lua @@ -0,0 +1,94 @@ +Skia Overview 2014 + +< transition =slide> + +One API -- many backends +- Raster [8888, 565, A8] +- GPU [opengl] +- PDF +- XPS +- Picture +- Pipe + + + +One Team -- many clients +- Chrome +- ChromeOS +- Clank +- Android Framework +- 3rd parties (e.g. FireFox) + + + + +Optimize for CPU variety +- x86 - 32bit (SSE, SSE2, ...), 64bit +- Arm - thumb, arm, NEON, ... 64bit? +- MIPS (just starting) + + + +Optimize for GPU variety +- Nvidia +- Qualcom +- Imagination +- ... +- ES2 -vs- ES3 -vs- Desktop profiles + +Lots of testing and measuring +- build-bots +-- unittests, micro-benchmarks, image-regressions +-- http://108.170.217.252:10117/console +- webpage archives (in progress) +-- "map-reduce" server for saerching/historgrams +-- macro-benchmarks, image-reressions +-- gpu : cpu fuzzy compares + +Skia Roadmap [Fall '13] + +Roadmap in a nutshell +- GPU performance +- Pictures +- Images +- Fonts +- PDF + +Roadmap : GPU Performance +- Clipping changes are expensive +- Texture cache optimizations +- Better batching / reordering +- Rely more on multi-sampling +- ES3/desktop features (e.g. path-rendering) +- ... continuo ad absurdum + +Roadmap : Pictures +- Playback performance +-- improve culling +-- multi-core support +- Record performance +-- improve hash/cache +-- improve measuring/bbox computation +- Feedback to clients +-- annotations +-- heat-map for time spent drawing +-- peep-hole optimizations + +Roadmap : Images +- HQ filtering and mipmaps +- Unpremul support +- sRGB support (future) +- Improve cache / lazy-decoding + +Roadmap : Fonts +- Color emoji +- DirectWrite on windows +-- subpixel positioning! +- new FontMgr -- extended styles + +Roadmap : PDF +- Android +-- perspective, color-filters +- New Viewer project +-- print-preview and more +-- can output picture / gpu directly diff --git a/resources/lua/slides_content2.lua b/resources/lua/slides_content2.lua new file mode 100644 index 0000000000..2b293a244a --- /dev/null +++ b/resources/lua/slides_content2.lua @@ -0,0 +1,123 @@ +Skia Update + +Skia : Access +- https://skia.org +- https://skia.googlesource.com/skia + +Skia : Overview +- portable graphics engine +- 2D transformations + perspective +- primitives: text, geometry, images +- effects: shaders, filters, antialiasing, blending + +Skia : Porting +- C++ and some SIMD assembly +- Fonts : CoreText, FreeType, GDI, DirectWrite +- Threads : wrappers for native apis +- Memory : wrappers for [new, malloc, discardable] + +Skia : Backends +- Surface +-- raster : ARGB, RGB16, A8 in software +-- gpu : transcribe to OpenGL +- Document +-- transcribe to PDF or XPS +- Record and Playback +-- Picture +-- Pipe + +Skia : Clients +- Blink : under the GraphicsContext hood +- Chrome : ui/gfx and compositor +- Android : framework +- third parties : e.g. Mozilla + +Skia In Blink + +Skia In Blink : Fonts +- SkTypeface and SkFontMgr : platform agnostic +- Runtime switch between GDI and DirectWrite +- SkTextBlob to encapsulate runs of text +- Push LCD decision-making out of Blink + +Skia In Blink : Record-Time-Rasterization +- What? : direct rendering during “Paint” pass +-- Image scaling, filters +-- SVG patterns, masks +- Problematic in modern Blink +-- CTM not always known/knowable +-- Rendering backend not always known (gpu or cpu) +-- Rasterization takes (too much) time + +Skia In Blink : RTR response +- SkImageFilter w/ CPU and GPU implementations +- Bitmap scaling : bilerp, mipmaps, fancy +- SkPicture for caching SVG +- SkPicture + saveLayer() for masks +-- PathOps for resolving complex paths +- SkPictureShader for device-independent patterns + +Skia In Blink : Recording +- GraphicsContext (now) backed by SkPicture +-- draw commands are recorded for later playback +-- all parameters must be copied or (safely) ref'd +-- may record more than is currently visible +- Resulting picture may be replayed multiple times +-- from different thread(s) + +Skia In Blink : Recording response +- New implementation +- Optimized for recording speed +-- shallow copies whenever possible +-- rearchitect all Skia effects to be immutable +- Reentrant-safe for playback in multiple threads +-- also affected effect subclasses + +Skia In Blink : Playback +- Separate pass for optimizations (optional) +-- peep-holes rewrites +-- compute bounding-box hierarchy for faster tiling +-- can be done outside of Blink thread +- GPU optimizations +-- layer "hoisting" +-- distance fields : fonts and concave paths + +Skia In Blink : multi-picture-draw +- mpd(canvas[], picture[], matrix[], paint[]) +- Requires independent canvas objects +-- all other parameters can be shared +-- draw order is unspecified +- Examples +-- 1 picture drawing to multiple tiles (canvases) +-- multiple pictures each drawing to its own layer + +Skia In Blink : MPD optimizations* +- GPU +-- "layer hoisting" to reduce rendertarget switching +-- layer atlasing (also applies to imagefilters) +-- pre-uploading of textures +-- atlas yuv (from jpeg) to convert on gpu +- CPU +-- parallel execution using thread pool +-- pre-decoding of images based on visibility + +Skia : Roadmap + +Skia : Roadmap - performance +- GPU +-- extended OpenGL features (e.g. geometry shaders) +-- reordering for increased batching +-- support for new low-level OpenGL APIs +- CPU +-- SIMD applied to floats +-- smarter culling in pictures + +Skia : Roadmap - API +- Cross process support +- Direct support for sRGB +- Robust file format +- Support PDF viewing +- Stable C ABI +-- bindings for JS, Go, Python, Lua + +Demo diff --git a/resources/lua/slides_transitions.lua b/resources/lua/slides_transitions.lua new file mode 100644 index 0000000000..bab3827767 --- /dev/null +++ b/resources/lua/slides_transitions.lua @@ -0,0 +1,208 @@ +function scale_text_delta(template, delta) + template = template.slide + for i = 1, #template do + local paint = template[i].paint + paint:setTextSize(paint:getTextSize() + delta) + end +end + +function slide_transition(prev, next, is_forward) + local rec = { + proc = function(self, canvas, drawSlideProc) + if self:isDone() then + drawSlideProc(canvas) + return nil + end + self.prevDrawable:draw(canvas, self.curr_x, 0) + self.nextDrawable:draw(canvas, self.curr_x + 640, 0) + self.curr_x = self.curr_x + self.step_x + return self + end + } + if is_forward then + rec.prevDrawable = prev + rec.nextDrawable = next + rec.curr_x = 0 + rec.step_x = -15 + rec.isDone = function (self) return self.curr_x <= -640 end + else + rec.prevDrawable = next + rec.nextDrawable = prev + rec.curr_x = -640 + rec.step_x = 15 + rec.isDone = function (self) return self.curr_x >= 0 end + end + return rec +end + +function sqr(value) return value * value end + +function set_blur(paint, alpha) + local sigma = sqr(1 - alpha) * 20 + if gUseBlurInTransitions then + paint:setImageFilter(Sk.newBlurImageFilter(sigma, sigma)) + end + paint:setAlpha(alpha) +end + +function fade_slide_transition(prev, next, is_forward) + local rec = { + paint = Sk.newPaint(), + prevDrawable = prev, + nextDrawable = next, + proc = function(self, canvas, drawSlideProc) + if self:isDone() then + drawSlideProc(canvas) + return nil + end + + set_blur(self.paint, self.prev_a) + self.prevDrawable:draw(canvas, self.prev_x, 0, self.paint) + + set_blur(self.paint, self.next_a) + self.nextDrawable:draw(canvas, self.next_x, 0, self.paint) + self:step() + return self + end + } + if is_forward then + rec.prev_x = 0 + rec.prev_a = 1 + rec.next_x = 640 + rec.next_a = 0 + rec.isDone = function (self) return self.next_x <= 0 end + rec.step = function (self) + self.next_x = self.next_x - 20 + self.next_a = (640 - self.next_x) / 640 + self.prev_a = 1 - self.next_a + end + else + rec.prev_x = 0 + rec.prev_a = 1 + rec.next_x = 0 + rec.next_a = 0 + rec.isDone = function (self) return self.prev_x >= 640 end + rec.step = function (self) + self.prev_x = self.prev_x + 20 + self.prev_a = (640 - self.prev_x) / 640 + self.next_a = 1 - self.prev_a + end + end + return rec +end + +function fade_transition(prev, next, is_forward) + local rec = { + paint = Sk.newPaint(), + prevDrawable = prev, + nextDrawable = next, + proc = function(self, canvas, drawSlideProc) + if self:isDone() then + drawSlideProc(canvas) + return nil + end + + set_blur(self.paint, self.prev_a) + self.prevDrawable:draw(canvas, 0, 0, self.paint) + + set_blur(self.paint, self.next_a) + self.nextDrawable:draw(canvas, 0, 0, self.paint) + self:step() + return self + end + } + rec.prev_a = 1 + rec.next_a = 0 + rec.isDone = function (self) return self.next_a >= 1 end + rec.step = function (self) + self.prev_a = math.max(self.prev_a - 0.025, 0) + self.next_a = 1 - self.prev_a + end + + return rec +end + +function rotate_transition(prev, next, is_forward) + local rec = { + angle = 0, + prevDrawable = prev, + nextDrawable = next, + activeDrawable = prev, + proc = function(self, canvas, drawSlideProc) + if self:isDone() then + drawSlideProc(canvas) + return nil + end + + canvas:save() + canvas:translate(320, 240) + canvas:rotate(self.angle) + canvas:translate(-320, -240) + self.activeDrawable:draw(canvas, 0, 0) + self:step() + return self + end, + isDone = function (self) return self.angle >= 360 or self.angle <= -360 end + } + if is_forward then + rec.step = function (self) + self.angle = self.angle + 10 + if self.angle >= 180 then + self.activeDrawable = self.nextDrawable + end + end + else + rec.step = function (self) + self.angle = self.angle - 10 + if self.angle <= -180 then + self.activeDrawable = self.nextDrawable + end + end + end + return rec +end + +function zoom_transition(prev, next, is_forward) + local rec = { + scale = 1, + scale_delta = .95, + scale_limit = 0.2, + pivot_x = 320, + pivot_y = 240, + prevDrawable = prev, + nextDrawable = next, + activeDrawable = prev, + proc = function(self, canvas, drawSlideProc) + if self:isDone() then + drawSlideProc(canvas) + return nil + end + + canvas:translate(self.pivot_x, self.pivot_y) + canvas:scale(self.scale, self.scale) + canvas:translate(-self.pivot_x, -self.pivot_y) + self.activeDrawable:draw(canvas, 0, 0) + self:step() + return self + end, + isDone = function (self) return self.scale > 1 end, + step = function (self) + if self.scale < self.scale_limit then + self.scale = self.scale_limit + self.scale_delta = 1 / self.scale_delta + self.activeDrawable = self.nextDrawable + end + self.scale = self.scale * self.scale_delta + end + } + return rec +end + +gTransitionTable = { + fade = fade_transition, + slide = slide_transition, + fade_slide = fade_slide_transition, + rotate = rotate_transition, + zoom = zoom_transition, +} + diff --git a/resources/lua/slides_utils.lua b/resources/lua/slides_utils.lua new file mode 100644 index 0000000000..3b1230c10b --- /dev/null +++ b/resources/lua/slides_utils.lua @@ -0,0 +1,102 @@ +function tostr(t) + local str = "" + for k, v in next, t do + if #str > 0 then + str = str .. ", " + end + if type(k) == "number" then + str = str .. "[" .. k .. "] = " + else + str = str .. tostring(k) .. " = " + end + if type(v) == "table" then + str = str .. "{ " .. tostr(v) .. " }" + elseif type(v) == "string" then + str = str .. '"' .. v .. '"' + else + str = str .. tostring(v) + end + end + return str +end + +function trim_ws(s) + return s:match("^%s*(.*)") +end + +function count_hypens(s) + local leftover = s:match("^-*(.*)") + return string.len(s) - string.len(leftover) +end + +function pretty_print_slide(slide) + io.write("{\n") + if slide.transition then + io.write(" transition = \"", slide.transition, "\",\n") + end + for i = 1, #slide do + local node = slide[i] + for j = 0, node.indent do + io.write(" ") + end + io.write("{ ") + io.write(tostr(node)) + io.write(" },\n") + end + io.write("},\n") +end + +function pretty_print_slides(slides) + io.write("gSlides = {\n") + for i = 1, #slides do + pretty_print_slide(slides[i]) + end + io.write("}\n") +end + +function parse_attr(s, lvalue) + local ts = "^<%s*" .. lvalue .. "%s*=%s*(%a+)%s*>$" + return s:match(ts) +end + +function flush(slides, block) + if #block > 0 then + slides[#slides + 1] = block + return {} + end + return block +end + +function parse_file(file) + local slides = {} + local block = {} + + for line in file:lines() do + local s = trim_ws(line) + if #s == 0 then -- done with a block + block = flush(slides, block) + else + local transition_type = parse_attr(s, "transition") + local blockstyle = parse_attr(s, "blockstyle") + if transition_type then + block["transition"] = transition_type + elseif blockstyle then + block["blockstyle"] = blockstyle + else + if block.blockstyle == "code" then + block[#block + 1] = { text = line } + else + local n = count_hypens(s) + block[#block + 1] = { + indent = n, + text = trim_ws(s:sub(n + 1, -1)) + } + end + end + end + end + flush(slides, block) + + return slides +end + diff --git a/resources/lua/test.lua b/resources/lua/test.lua new file mode 100644 index 0000000000..03201baeda --- /dev/null +++ b/resources/lua/test.lua @@ -0,0 +1,76 @@ + +local r = { left = 10, top = 10, right = 100, bottom = 80 } +local x = 0; + +local paint = Sk.newPaint(); +paint:setAntiAlias(true); + +local image -- = Sk.loadImage('/skia/sailboat.jpg'); +function setImageFilename(filename) + image = Sk.loadImage(filename) +end + + +local color = {a = 1, r = 1, g = 0, b = 0}; + +function rnd(range) + return math.random() * range; +end + +rndX = function () return rnd(640) end +rndY = function () return rnd(480) end + +function draw_rand_path(canvas); + if not path_paint then + path_paint = Sk.newPaint(); + path_paint:setAntiAlias(true); + end + path_paint:setColor({a = 1, r = math.random(), g = math.random(), b = math.random() }); + + local path = Sk.newPath(); + path:moveTo(rndX(), rndY()); + for i = 0, 50 do + path:quadTo(rndX(), rndY(), rndX(), rndY()); + end + canvas:drawPath(path, path_paint); + + paint:setColor{a=1,r=0,g=0,b=1}; + local align = { 'left', 'center', 'right' }; + paint:setTextSize(30); + for k, v in next, align do + paint:setTextAlign(v); + canvas:drawText('Hamburgefons', 320, 200 + 30*k, paint); + end +end + +function onStartup() + local paint = Sk.newPaint(); + paint:setColor{a=1, r=1, g=0, b=0}; + if false then + local doc = Sk.newDocumentPDF('out/test.pdf'); + local canvas = doc:beginPage(72*8.5, 72*11); + canvas:drawText('Hello Lua', 300, 300, paint); + doc:close(); + doc = nil; + end +end + +function onDrawContent(canvas) + draw_rand_path(canvas); + color.g = x / 100; + paint:setColor(color) + canvas:translate(x, 0); + canvas:drawOval(r, paint) + x = x + 1; + local r2 = {} + r2.left = x; + r2.top = r.bottom + 50; + r2.right = r2.left + image:width() * 1; + r2.bottom = r2.top + image:height() * 1; + canvas:drawImageRect(image, nil, r2, 0.75); + if x > 200 then x = 0 end; + + return true -- so we can animate +end + +onStartup() diff --git a/resources/mandrill.wbmp b/resources/mandrill.wbmp deleted file mode 100644 index ac84598cf0..0000000000 Binary files a/resources/mandrill.wbmp and /dev/null differ diff --git a/resources/mandrill_128.png b/resources/mandrill_128.png deleted file mode 100644 index 32f163773f..0000000000 Binary files a/resources/mandrill_128.png and /dev/null differ diff --git a/resources/mandrill_16.png b/resources/mandrill_16.png deleted file mode 100644 index e5703f52d6..0000000000 Binary files a/resources/mandrill_16.png and /dev/null differ diff --git a/resources/mandrill_256.png b/resources/mandrill_256.png deleted file mode 100644 index 0c6908424b..0000000000 Binary files a/resources/mandrill_256.png and /dev/null differ diff --git a/resources/mandrill_32.png b/resources/mandrill_32.png deleted file mode 100644 index c30e451d90..0000000000 Binary files a/resources/mandrill_32.png and /dev/null differ diff --git a/resources/mandrill_512.png b/resources/mandrill_512.png deleted file mode 100644 index c2efb8108d..0000000000 Binary files a/resources/mandrill_512.png and /dev/null differ diff --git a/resources/mandrill_512_q075.jpg b/resources/mandrill_512_q075.jpg deleted file mode 100644 index c2c215f2e9..0000000000 Binary files a/resources/mandrill_512_q075.jpg and /dev/null differ diff --git a/resources/mandrill_64.png b/resources/mandrill_64.png deleted file mode 100644 index d2e94cc891..0000000000 Binary files a/resources/mandrill_64.png and /dev/null differ diff --git a/resources/mandrill_h1v1.jpg b/resources/mandrill_h1v1.jpg deleted file mode 100644 index 388236d21a..0000000000 Binary files a/resources/mandrill_h1v1.jpg and /dev/null differ diff --git a/resources/mandrill_h2v1.jpg b/resources/mandrill_h2v1.jpg deleted file mode 100644 index 573888a40f..0000000000 Binary files a/resources/mandrill_h2v1.jpg and /dev/null differ diff --git a/resources/plane.png b/resources/plane.png deleted file mode 100644 index 03585b5cb4..0000000000 Binary files a/resources/plane.png and /dev/null differ diff --git a/resources/plane_interlaced.png b/resources/plane_interlaced.png deleted file mode 100644 index 3b217f205d..0000000000 Binary files a/resources/plane_interlaced.png and /dev/null differ diff --git a/resources/rainbow-gradient.png b/resources/rainbow-gradient.png deleted file mode 100644 index 4e18a32716..0000000000 Binary files a/resources/rainbow-gradient.png and /dev/null differ diff --git a/resources/randPixels.bmp b/resources/randPixels.bmp deleted file mode 100644 index 1e4ab3b652..0000000000 Binary files a/resources/randPixels.bmp and /dev/null differ diff --git a/resources/randPixels.gif b/resources/randPixels.gif deleted file mode 100644 index 04c8bb9c3a..0000000000 Binary files a/resources/randPixels.gif and /dev/null differ diff --git a/resources/randPixels.jpg b/resources/randPixels.jpg deleted file mode 100644 index ca57fbddf3..0000000000 Binary files a/resources/randPixels.jpg and /dev/null differ diff --git a/resources/randPixels.png b/resources/randPixels.png deleted file mode 100644 index 49ef84603f..0000000000 Binary files a/resources/randPixels.png and /dev/null differ diff --git a/resources/randPixels.webp b/resources/randPixels.webp deleted file mode 100644 index 135441e541..0000000000 Binary files a/resources/randPixels.webp and /dev/null differ diff --git a/resources/randPixelsAnim.gif b/resources/randPixelsAnim.gif deleted file mode 100644 index 7b12bfc6f6..0000000000 Binary files a/resources/randPixelsAnim.gif and /dev/null differ diff --git a/resources/randPixelsAnim2.gif b/resources/randPixelsAnim2.gif deleted file mode 100644 index 2b2b456155..0000000000 Binary files a/resources/randPixelsAnim2.gif and /dev/null differ diff --git a/resources/randPixelsOffset.gif b/resources/randPixelsOffset.gif deleted file mode 100644 index df326b81f2..0000000000 Binary files a/resources/randPixelsOffset.gif and /dev/null differ diff --git a/resources/required.gif b/resources/required.gif deleted file mode 100644 index 91a9fd17e8..0000000000 Binary files a/resources/required.gif and /dev/null differ diff --git a/resources/required.webp b/resources/required.webp deleted file mode 100644 index 9f9a8f8b8d..0000000000 Binary files a/resources/required.webp and /dev/null differ diff --git a/resources/rle.bmp b/resources/rle.bmp deleted file mode 100644 index a08745fb2d..0000000000 Binary files a/resources/rle.bmp and /dev/null differ diff --git a/resources/sample_1mp.dng b/resources/sample_1mp.dng deleted file mode 100644 index c1c10787c7..0000000000 Binary files a/resources/sample_1mp.dng and /dev/null differ diff --git a/resources/sample_1mp_rotated.dng b/resources/sample_1mp_rotated.dng deleted file mode 100644 index e0270abae1..0000000000 Binary files a/resources/sample_1mp_rotated.dng and /dev/null differ diff --git a/resources/shadowreference.png b/resources/shadowreference.png deleted file mode 100755 index cca6fff645..0000000000 Binary files a/resources/shadowreference.png and /dev/null differ diff --git a/resources/ship.png b/resources/ship.png deleted file mode 100755 index acb4fd4279..0000000000 Binary files a/resources/ship.png and /dev/null differ diff --git a/resources/slides.lua b/resources/slides.lua deleted file mode 100644 index 9d61a87273..0000000000 --- a/resources/slides.lua +++ /dev/null @@ -1,356 +0,0 @@ -gShowBounds = false -gUseBlurInTransitions = false - -gPath = "resources/" - -function load_file(file) - local prev_path = package.path - package.path = package.path .. ";" .. gPath .. file .. ".lua" - require(file) - package.path = prev_path -end - -load_file("slides_utils") - -gSlides = parse_file(io.open("resources/slides_content2.lua", "r")) - -function make_rect(l, t, r, b) - return { left = l, top = t, right = r, bottom = b } -end - -function make_paint(typefacename, style, size, color) - local paint = Sk.newPaint(); - paint:setAntiAlias(true) - paint:setSubpixelText(true) - paint:setTypeface(Sk.newTypeface(typefacename, style)) - paint:setTextSize(size) - paint:setColor(color) - return paint -end - -function draw_bullet(canvas, x, y, paint, indent) - if 0 == indent then - return - end - local ps = paint:getTextSize() - local cx = x - ps * .8 - local cy = y - ps * .4 - local radius = ps * .2 - canvas:drawCircle(cx, cy, radius, paint) -end - -function stroke_rect(canvas, rect, color) - local paint = Sk.newPaint() - paint:setStroke(true); - paint:setColor(color) - canvas:drawRect(rect, paint) -end - -function drawSlide(canvas, slide, master_template) - - if #slide == 1 then - template = master_template.title - canvas:drawText(slide[1].text, 320, 240, template[1]) - return - end - - template = master_template.slide - - local x = template.margin_x - local y = template.margin_y - local scale = 1.25 - - if slide.blockstyle == "code" then - local paint = master_template.codePaint - local fm = paint:getFontMetrics() - local height = #slide * (fm.descent - fm.ascent) - y = (480 - height) / 2 - for i = 1, #slide do - local node = slide[i] - y = y - fm.ascent * scale - canvas:drawText(node.text, x, y, paint) - y = y + fm.descent * scale - end - return - end - - for i = 1, #slide do - local node = slide[i] - local paint = template[node.indent + 1].paint - local extra_dy = template[node.indent + 1].extra_dy - local fm = paint:getFontMetrics() - local x_offset = -fm.ascent * node.indent * 1.25 - - local bounds = make_rect(x + x_offset, y, 620, 640) - local blob, newBottom = Sk.newTextBlob(node.text, bounds, paint) - draw_bullet(canvas, x + x_offset, y - fm.ascent, paint, node.indent) - canvas:drawTextBlob(blob, 0, 0, paint) - y = newBottom + paint:getTextSize() * .5 + extra_dy - - if gShowBounds then - bounds.bottom = newBottom - stroke_rect(canvas, bounds, {a=1,r=0,g=1,b=0}) - stroke_rect(canvas, blob:bounds(), {a=1,r=1,g=0,b=0}) - end - - end -end - --------------------------------------------------------------------------------------- -function make_tmpl(paint, extra_dy) - return { paint = paint, extra_dy = extra_dy } -end - -function SkiaPoint_make_template() - normal = Sk.newFontStyle() - bold = Sk.newFontStyle(700) - local title = { - margin_x = 30, - margin_y = 100, - } - title[1] = make_paint("Arial", bold, 45, { a=1, r=1, g=1, b=1 }) - title[1]:setTextAlign("center") - title[2] = make_paint("Arial", bold, 25, { a=1, r=.75, g=.75, b=.75 }) - title[2]:setTextAlign("center") - - local slide = { - margin_x = 20, - margin_y = 25, - } - slide[1] = make_tmpl(make_paint("Arial", bold, 35, { a=1, r=1, g=1, b=1 }), 18) - slide[2] = make_tmpl(make_paint("Arial", normal, 25, { a=1, r=1, g=1, b=1 }), 10) - slide[3] = make_tmpl(make_paint("Arial", normal, 20, { a=1, r=.9, g=.9, b=.9 }), 5) - - return { - title = title, - slide = slide, - codePaint = make_paint("Courier", normal, 20, { a=1, r=.9, g=.9, b=.9 }), - } -end - -gTemplate = SkiaPoint_make_template() - -gRedPaint = Sk.newPaint() -gRedPaint:setAntiAlias(true) -gRedPaint:setColor{a=1, r=1, g=0, b=0 } - --- animation.proc is passed the canvas before drawing. --- The animation.proc returns itself or another animation (which means keep animating) --- or it returns nil, which stops the animation. --- -local gCurrAnimation - -gSlideIndex = 1 - ------------------------------------------------------------------------------ - -function new_drawable_picture(pic) - return { - picture = pic, - width = pic:width(), - height = pic:height(), - draw = function (self, canvas, x, y, paint) - canvas:drawPicture(self.picture, x, y, paint) - end - } -end - -function new_drawable_image(img) - return { - image = img, - width = img:width(), - height = img:height(), - draw = function (self, canvas, x, y, paint) - canvas:drawImage(self.image, x, y, paint) - end - } -end - -function convert_to_picture_drawable(slide) - local rec = Sk.newPictureRecorder() - drawSlide(rec:beginRecording(640, 480), slide, gTemplate) - return new_drawable_picture(rec:endRecording()) -end - -function convert_to_image_drawable(slide) - local surf = Sk.newRasterSurface(640, 480) - drawSlide(surf:getCanvas(), slide, gTemplate) - return new_drawable_image(surf:newImageSnapshot()) -end - -function new_drawable_slide(slide) - return { - slide = slide, - draw = function (self, canvas, x, y, paint) - if (nil == paint or ("number" == type(paint) and (1 == paint))) then - canvas:save() - else - canvas:saveLayer(paint) - end - canvas:translate(x, y) - drawSlide(canvas, self.slide, gTemplate) - canvas:restore() - end - } -end - -gNewDrawableFactory = { - default = new_drawable_slide, - picture = convert_to_picture_drawable, - image = convert_to_image_drawable, -} - ------------------------------------------------------------------------------ - -function next_slide() - local prev = gSlides[gSlideIndex] - - if gSlideIndex < #gSlides then - gSlideIndex = gSlideIndex + 1 - spawn_transition(prev, gSlides[gSlideIndex], true) - end -end - -function prev_slide() - local prev = gSlides[gSlideIndex] - - if gSlideIndex > 1 then - gSlideIndex = gSlideIndex - 1 - spawn_transition(prev, gSlides[gSlideIndex], false) - end -end - -gDrawableType = "default" - -load_file("slides_transitions") - -function spawn_transition(prevSlide, nextSlide, is_forward) - local transition - if is_forward then - transition = gTransitionTable[nextSlide.transition] - else - transition = gTransitionTable[prevSlide.transition] - end - - if not transition then - transition = fade_slide_transition - end - - local prevDrawable = gNewDrawableFactory[gDrawableType](prevSlide) - local nextDrawable = gNewDrawableFactory[gDrawableType](nextSlide) - gCurrAnimation = transition(prevDrawable, nextDrawable, is_forward) -end - --------------------------------------------------------------------------------------- - -function spawn_rotate_animation() - gCurrAnimation = { - angle = 0, - angle_delta = 5, - pivot_x = 320, - pivot_y = 240, - proc = function (self, canvas, drawSlideProc) - if self.angle >= 360 then - drawSlideProc(canvas) - return nil - end - canvas:translate(self.pivot_x, self.pivot_y) - canvas:rotate(self.angle) - canvas:translate(-self.pivot_x, -self.pivot_y) - drawSlideProc(canvas) - - self.angle = self.angle + self.angle_delta - return self - end - } -end - -function spawn_scale_animation() - gCurrAnimation = { - scale = 1, - scale_delta = .95, - scale_limit = 0.2, - pivot_x = 320, - pivot_y = 240, - proc = function (self, canvas, drawSlideProc) - if self.scale < self.scale_limit then - self.scale = self.scale_limit - self.scale_delta = 1 / self.scale_delta - end - if self.scale > 1 then - drawSlideProc(canvas) - return nil - end - canvas:translate(self.pivot_x, self.pivot_y) - canvas:scale(self.scale, self.scale) - canvas:translate(-self.pivot_x, -self.pivot_y) - drawSlideProc(canvas) - - self.scale = self.scale * self.scale_delta - return self - end - } -end - -local bgPaint = nil - -function draw_bg(canvas) - if not bgPaint then - bgPaint = Sk.newPaint() - local grad = Sk.newLinearGradient( 0, 0, { a=1, r=0, g=0, b=.3 }, - 640, 480, { a=1, r=0, g=0, b=.8 }) - bgPaint:setShader(grad) - bgPaint:setDither(true) - end - - canvas:drawPaint(bgPaint) -end - -function onDrawContent(canvas, width, height) - local matrix = Sk.newMatrix() - matrix:setRectToRect(make_rect(0, 0, 640, 480), make_rect(0, 0, width, height), "center") - canvas:concat(matrix) - - draw_bg(canvas) - - local drawSlideProc = function(canvas) - drawSlide(canvas, gSlides[gSlideIndex], gTemplate) - end - - if gCurrAnimation then - gCurrAnimation = gCurrAnimation:proc(canvas, drawSlideProc) - return true - else - drawSlideProc(canvas) - return false - end -end - -function onClickHandler(x, y) - return false -end - -local keyProcs = { - n = next_slide, - p = prev_slide, - r = spawn_rotate_animation, - s = spawn_scale_animation, - ["="] = function () scale_text_delta(gTemplate, 1) end, - ["-"] = function () scale_text_delta(gTemplate, -1) end, - - b = function () gShowBounds = not gShowBounds end, - B = function () gUseBlurInTransitions = not gUseBlurInTransitions end, - - ["1"] = function () gDrawableType = "default" end, - ["2"] = function () gDrawableType = "picture" end, - ["3"] = function () gDrawableType = "image" end, -} - -function onCharHandler(uni) - local proc = keyProcs[uni] - if proc then - proc() - return true - end - return false -end diff --git a/resources/slides_content.lua b/resources/slides_content.lua deleted file mode 100644 index 9b20e43c6b..0000000000 --- a/resources/slides_content.lua +++ /dev/null @@ -1,94 +0,0 @@ -Skia Overview 2014 - -< transition =slide> - -One API -- many backends -- Raster [8888, 565, A8] -- GPU [opengl] -- PDF -- XPS -- Picture -- Pipe - - - -One Team -- many clients -- Chrome -- ChromeOS -- Clank -- Android Framework -- 3rd parties (e.g. FireFox) - - - - -Optimize for CPU variety -- x86 - 32bit (SSE, SSE2, ...), 64bit -- Arm - thumb, arm, NEON, ... 64bit? -- MIPS (just starting) - - - -Optimize for GPU variety -- Nvidia -- Qualcom -- Imagination -- ... -- ES2 -vs- ES3 -vs- Desktop profiles - -Lots of testing and measuring -- build-bots --- unittests, micro-benchmarks, image-regressions --- http://108.170.217.252:10117/console -- webpage archives (in progress) --- "map-reduce" server for saerching/historgrams --- macro-benchmarks, image-reressions --- gpu : cpu fuzzy compares - -Skia Roadmap [Fall '13] - -Roadmap in a nutshell -- GPU performance -- Pictures -- Images -- Fonts -- PDF - -Roadmap : GPU Performance -- Clipping changes are expensive -- Texture cache optimizations -- Better batching / reordering -- Rely more on multi-sampling -- ES3/desktop features (e.g. path-rendering) -- ... continuo ad absurdum - -Roadmap : Pictures -- Playback performance --- improve culling --- multi-core support -- Record performance --- improve hash/cache --- improve measuring/bbox computation -- Feedback to clients --- annotations --- heat-map for time spent drawing --- peep-hole optimizations - -Roadmap : Images -- HQ filtering and mipmaps -- Unpremul support -- sRGB support (future) -- Improve cache / lazy-decoding - -Roadmap : Fonts -- Color emoji -- DirectWrite on windows --- subpixel positioning! -- new FontMgr -- extended styles - -Roadmap : PDF -- Android --- perspective, color-filters -- New Viewer project --- print-preview and more --- can output picture / gpu directly diff --git a/resources/slides_content2.lua b/resources/slides_content2.lua deleted file mode 100644 index 2b293a244a..0000000000 --- a/resources/slides_content2.lua +++ /dev/null @@ -1,123 +0,0 @@ -Skia Update - -Skia : Access -- https://skia.org -- https://skia.googlesource.com/skia - -Skia : Overview -- portable graphics engine -- 2D transformations + perspective -- primitives: text, geometry, images -- effects: shaders, filters, antialiasing, blending - -Skia : Porting -- C++ and some SIMD assembly -- Fonts : CoreText, FreeType, GDI, DirectWrite -- Threads : wrappers for native apis -- Memory : wrappers for [new, malloc, discardable] - -Skia : Backends -- Surface --- raster : ARGB, RGB16, A8 in software --- gpu : transcribe to OpenGL -- Document --- transcribe to PDF or XPS -- Record and Playback --- Picture --- Pipe - -Skia : Clients -- Blink : under the GraphicsContext hood -- Chrome : ui/gfx and compositor -- Android : framework -- third parties : e.g. Mozilla - -Skia In Blink - -Skia In Blink : Fonts -- SkTypeface and SkFontMgr : platform agnostic -- Runtime switch between GDI and DirectWrite -- SkTextBlob to encapsulate runs of text -- Push LCD decision-making out of Blink - -Skia In Blink : Record-Time-Rasterization -- What? : direct rendering during “Paint” pass --- Image scaling, filters --- SVG patterns, masks -- Problematic in modern Blink --- CTM not always known/knowable --- Rendering backend not always known (gpu or cpu) --- Rasterization takes (too much) time - -Skia In Blink : RTR response -- SkImageFilter w/ CPU and GPU implementations -- Bitmap scaling : bilerp, mipmaps, fancy -- SkPicture for caching SVG -- SkPicture + saveLayer() for masks --- PathOps for resolving complex paths -- SkPictureShader for device-independent patterns - -Skia In Blink : Recording -- GraphicsContext (now) backed by SkPicture --- draw commands are recorded for later playback --- all parameters must be copied or (safely) ref'd --- may record more than is currently visible -- Resulting picture may be replayed multiple times --- from different thread(s) - -Skia In Blink : Recording response -- New implementation -- Optimized for recording speed --- shallow copies whenever possible --- rearchitect all Skia effects to be immutable -- Reentrant-safe for playback in multiple threads --- also affected effect subclasses - -Skia In Blink : Playback -- Separate pass for optimizations (optional) --- peep-holes rewrites --- compute bounding-box hierarchy for faster tiling --- can be done outside of Blink thread -- GPU optimizations --- layer "hoisting" --- distance fields : fonts and concave paths - -Skia In Blink : multi-picture-draw -- mpd(canvas[], picture[], matrix[], paint[]) -- Requires independent canvas objects --- all other parameters can be shared --- draw order is unspecified -- Examples --- 1 picture drawing to multiple tiles (canvases) --- multiple pictures each drawing to its own layer - -Skia In Blink : MPD optimizations* -- GPU --- "layer hoisting" to reduce rendertarget switching --- layer atlasing (also applies to imagefilters) --- pre-uploading of textures --- atlas yuv (from jpeg) to convert on gpu -- CPU --- parallel execution using thread pool --- pre-decoding of images based on visibility - -Skia : Roadmap - -Skia : Roadmap - performance -- GPU --- extended OpenGL features (e.g. geometry shaders) --- reordering for increased batching --- support for new low-level OpenGL APIs -- CPU --- SIMD applied to floats --- smarter culling in pictures - -Skia : Roadmap - API -- Cross process support -- Direct support for sRGB -- Robust file format -- Support PDF viewing -- Stable C ABI --- bindings for JS, Go, Python, Lua - -Demo diff --git a/resources/slides_transitions.lua b/resources/slides_transitions.lua deleted file mode 100644 index bab3827767..0000000000 --- a/resources/slides_transitions.lua +++ /dev/null @@ -1,208 +0,0 @@ -function scale_text_delta(template, delta) - template = template.slide - for i = 1, #template do - local paint = template[i].paint - paint:setTextSize(paint:getTextSize() + delta) - end -end - -function slide_transition(prev, next, is_forward) - local rec = { - proc = function(self, canvas, drawSlideProc) - if self:isDone() then - drawSlideProc(canvas) - return nil - end - self.prevDrawable:draw(canvas, self.curr_x, 0) - self.nextDrawable:draw(canvas, self.curr_x + 640, 0) - self.curr_x = self.curr_x + self.step_x - return self - end - } - if is_forward then - rec.prevDrawable = prev - rec.nextDrawable = next - rec.curr_x = 0 - rec.step_x = -15 - rec.isDone = function (self) return self.curr_x <= -640 end - else - rec.prevDrawable = next - rec.nextDrawable = prev - rec.curr_x = -640 - rec.step_x = 15 - rec.isDone = function (self) return self.curr_x >= 0 end - end - return rec -end - -function sqr(value) return value * value end - -function set_blur(paint, alpha) - local sigma = sqr(1 - alpha) * 20 - if gUseBlurInTransitions then - paint:setImageFilter(Sk.newBlurImageFilter(sigma, sigma)) - end - paint:setAlpha(alpha) -end - -function fade_slide_transition(prev, next, is_forward) - local rec = { - paint = Sk.newPaint(), - prevDrawable = prev, - nextDrawable = next, - proc = function(self, canvas, drawSlideProc) - if self:isDone() then - drawSlideProc(canvas) - return nil - end - - set_blur(self.paint, self.prev_a) - self.prevDrawable:draw(canvas, self.prev_x, 0, self.paint) - - set_blur(self.paint, self.next_a) - self.nextDrawable:draw(canvas, self.next_x, 0, self.paint) - self:step() - return self - end - } - if is_forward then - rec.prev_x = 0 - rec.prev_a = 1 - rec.next_x = 640 - rec.next_a = 0 - rec.isDone = function (self) return self.next_x <= 0 end - rec.step = function (self) - self.next_x = self.next_x - 20 - self.next_a = (640 - self.next_x) / 640 - self.prev_a = 1 - self.next_a - end - else - rec.prev_x = 0 - rec.prev_a = 1 - rec.next_x = 0 - rec.next_a = 0 - rec.isDone = function (self) return self.prev_x >= 640 end - rec.step = function (self) - self.prev_x = self.prev_x + 20 - self.prev_a = (640 - self.prev_x) / 640 - self.next_a = 1 - self.prev_a - end - end - return rec -end - -function fade_transition(prev, next, is_forward) - local rec = { - paint = Sk.newPaint(), - prevDrawable = prev, - nextDrawable = next, - proc = function(self, canvas, drawSlideProc) - if self:isDone() then - drawSlideProc(canvas) - return nil - end - - set_blur(self.paint, self.prev_a) - self.prevDrawable:draw(canvas, 0, 0, self.paint) - - set_blur(self.paint, self.next_a) - self.nextDrawable:draw(canvas, 0, 0, self.paint) - self:step() - return self - end - } - rec.prev_a = 1 - rec.next_a = 0 - rec.isDone = function (self) return self.next_a >= 1 end - rec.step = function (self) - self.prev_a = math.max(self.prev_a - 0.025, 0) - self.next_a = 1 - self.prev_a - end - - return rec -end - -function rotate_transition(prev, next, is_forward) - local rec = { - angle = 0, - prevDrawable = prev, - nextDrawable = next, - activeDrawable = prev, - proc = function(self, canvas, drawSlideProc) - if self:isDone() then - drawSlideProc(canvas) - return nil - end - - canvas:save() - canvas:translate(320, 240) - canvas:rotate(self.angle) - canvas:translate(-320, -240) - self.activeDrawable:draw(canvas, 0, 0) - self:step() - return self - end, - isDone = function (self) return self.angle >= 360 or self.angle <= -360 end - } - if is_forward then - rec.step = function (self) - self.angle = self.angle + 10 - if self.angle >= 180 then - self.activeDrawable = self.nextDrawable - end - end - else - rec.step = function (self) - self.angle = self.angle - 10 - if self.angle <= -180 then - self.activeDrawable = self.nextDrawable - end - end - end - return rec -end - -function zoom_transition(prev, next, is_forward) - local rec = { - scale = 1, - scale_delta = .95, - scale_limit = 0.2, - pivot_x = 320, - pivot_y = 240, - prevDrawable = prev, - nextDrawable = next, - activeDrawable = prev, - proc = function(self, canvas, drawSlideProc) - if self:isDone() then - drawSlideProc(canvas) - return nil - end - - canvas:translate(self.pivot_x, self.pivot_y) - canvas:scale(self.scale, self.scale) - canvas:translate(-self.pivot_x, -self.pivot_y) - self.activeDrawable:draw(canvas, 0, 0) - self:step() - return self - end, - isDone = function (self) return self.scale > 1 end, - step = function (self) - if self.scale < self.scale_limit then - self.scale = self.scale_limit - self.scale_delta = 1 / self.scale_delta - self.activeDrawable = self.nextDrawable - end - self.scale = self.scale * self.scale_delta - end - } - return rec -end - -gTransitionTable = { - fade = fade_transition, - slide = slide_transition, - fade_slide = fade_slide_transition, - rotate = rotate_transition, - zoom = zoom_transition, -} - diff --git a/resources/slides_utils.lua b/resources/slides_utils.lua deleted file mode 100644 index 3b1230c10b..0000000000 --- a/resources/slides_utils.lua +++ /dev/null @@ -1,102 +0,0 @@ -function tostr(t) - local str = "" - for k, v in next, t do - if #str > 0 then - str = str .. ", " - end - if type(k) == "number" then - str = str .. "[" .. k .. "] = " - else - str = str .. tostring(k) .. " = " - end - if type(v) == "table" then - str = str .. "{ " .. tostr(v) .. " }" - elseif type(v) == "string" then - str = str .. '"' .. v .. '"' - else - str = str .. tostring(v) - end - end - return str -end - -function trim_ws(s) - return s:match("^%s*(.*)") -end - -function count_hypens(s) - local leftover = s:match("^-*(.*)") - return string.len(s) - string.len(leftover) -end - -function pretty_print_slide(slide) - io.write("{\n") - if slide.transition then - io.write(" transition = \"", slide.transition, "\",\n") - end - for i = 1, #slide do - local node = slide[i] - for j = 0, node.indent do - io.write(" ") - end - io.write("{ ") - io.write(tostr(node)) - io.write(" },\n") - end - io.write("},\n") -end - -function pretty_print_slides(slides) - io.write("gSlides = {\n") - for i = 1, #slides do - pretty_print_slide(slides[i]) - end - io.write("}\n") -end - -function parse_attr(s, lvalue) - local ts = "^<%s*" .. lvalue .. "%s*=%s*(%a+)%s*>$" - return s:match(ts) -end - -function flush(slides, block) - if #block > 0 then - slides[#slides + 1] = block - return {} - end - return block -end - -function parse_file(file) - local slides = {} - local block = {} - - for line in file:lines() do - local s = trim_ws(line) - if #s == 0 then -- done with a block - block = flush(slides, block) - else - local transition_type = parse_attr(s, "transition") - local blockstyle = parse_attr(s, "blockstyle") - if transition_type then - block["transition"] = transition_type - elseif blockstyle then - block["blockstyle"] = blockstyle - else - if block.blockstyle == "code" then - block[#block + 1] = { text = line } - else - local n = count_hypens(s) - block[#block + 1] = { - indent = n, - text = trim_ws(s:sub(n + 1, -1)) - } - end - end - end - end - flush(slides, block) - - return slides -end - diff --git a/resources/test.lua b/resources/test.lua deleted file mode 100644 index 03201baeda..0000000000 --- a/resources/test.lua +++ /dev/null @@ -1,76 +0,0 @@ - -local r = { left = 10, top = 10, right = 100, bottom = 80 } -local x = 0; - -local paint = Sk.newPaint(); -paint:setAntiAlias(true); - -local image -- = Sk.loadImage('/skia/sailboat.jpg'); -function setImageFilename(filename) - image = Sk.loadImage(filename) -end - - -local color = {a = 1, r = 1, g = 0, b = 0}; - -function rnd(range) - return math.random() * range; -end - -rndX = function () return rnd(640) end -rndY = function () return rnd(480) end - -function draw_rand_path(canvas); - if not path_paint then - path_paint = Sk.newPaint(); - path_paint:setAntiAlias(true); - end - path_paint:setColor({a = 1, r = math.random(), g = math.random(), b = math.random() }); - - local path = Sk.newPath(); - path:moveTo(rndX(), rndY()); - for i = 0, 50 do - path:quadTo(rndX(), rndY(), rndX(), rndY()); - end - canvas:drawPath(path, path_paint); - - paint:setColor{a=1,r=0,g=0,b=1}; - local align = { 'left', 'center', 'right' }; - paint:setTextSize(30); - for k, v in next, align do - paint:setTextAlign(v); - canvas:drawText('Hamburgefons', 320, 200 + 30*k, paint); - end -end - -function onStartup() - local paint = Sk.newPaint(); - paint:setColor{a=1, r=1, g=0, b=0}; - if false then - local doc = Sk.newDocumentPDF('out/test.pdf'); - local canvas = doc:beginPage(72*8.5, 72*11); - canvas:drawText('Hello Lua', 300, 300, paint); - doc:close(); - doc = nil; - end -end - -function onDrawContent(canvas) - draw_rand_path(canvas); - color.g = x / 100; - paint:setColor(color) - canvas:translate(x, 0); - canvas:drawOval(r, paint) - x = x + 1; - local r2 = {} - r2.left = x; - r2.top = r.bottom + 50; - r2.right = r2.left + image:width() * 1; - r2.bottom = r2.top + image:height() * 1; - canvas:drawImageRect(image, nil, r2, 0.75); - if x > 200 then x = 0 end; - - return true -- so we can animate -end - -onStartup() diff --git a/resources/test640x479.gif b/resources/test640x479.gif deleted file mode 100644 index a17cb083bb..0000000000 Binary files a/resources/test640x479.gif and /dev/null differ diff --git a/resources/webp-animated.webp b/resources/webp-animated.webp deleted file mode 100755 index 35a8dfcf34..0000000000 Binary files a/resources/webp-animated.webp and /dev/null differ diff --git a/resources/webp-color-profile-crash.webp b/resources/webp-color-profile-crash.webp deleted file mode 100644 index 3b0904e0f2..0000000000 Binary files a/resources/webp-color-profile-crash.webp and /dev/null differ diff --git a/resources/webp-color-profile-lossless.webp b/resources/webp-color-profile-lossless.webp deleted file mode 100644 index 4fd63d5794..0000000000 Binary files a/resources/webp-color-profile-lossless.webp and /dev/null differ diff --git a/resources/webp-color-profile-lossy-alpha.webp b/resources/webp-color-profile-lossy-alpha.webp deleted file mode 100644 index 1a13084e77..0000000000 Binary files a/resources/webp-color-profile-lossy-alpha.webp and /dev/null differ diff --git a/resources/webp-color-profile-lossy.webp b/resources/webp-color-profile-lossy.webp deleted file mode 100644 index fdff0a9941..0000000000 Binary files a/resources/webp-color-profile-lossy.webp and /dev/null differ diff --git a/resources/yellow_rose.png b/resources/yellow_rose.png deleted file mode 100644 index 140c0b9c56..0000000000 Binary files a/resources/yellow_rose.png and /dev/null differ diff --git a/resources/yellow_rose.webp b/resources/yellow_rose.webp deleted file mode 100644 index f7dc20839e..0000000000 Binary files a/resources/yellow_rose.webp and /dev/null differ -- cgit v1.2.3