From: Eunki, Hong Date: Mon, 2 Aug 2021 08:11:51 +0000 (+0900) Subject: Add Sample with Encoded Image Buffer X-Git-Tag: dali_2.0.38~2 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-demo.git;a=commitdiff_plain;h=205f1338ab86cef96b9dd2cd4dd9dff7b8cd92f8 Add Sample with Encoded Image Buffer Change-Id: I6addda2bdc0628f53ce113ff148e9ade7f75b63d Signed-off-by: Eunki, Hong --- diff --git a/examples-reel/dali-examples-reel.cpp b/examples-reel/dali-examples-reel.cpp index 5d137cb..e1ba60d 100644 --- a/examples-reel/dali-examples-reel.cpp +++ b/examples-reel/dali-examples-reel.cpp @@ -66,6 +66,7 @@ int DALI_EXPORT_API main(int argc, char** argv) demo.AddExample(Example("image-scaling-irregular-grid.example", DALI_DEMO_STR_TITLE_IMAGE_SCALING)); demo.AddExample(Example("image-view.example", DALI_DEMO_STR_TITLE_IMAGE_VIEW)); demo.AddExample(Example("image-view-alpha-blending.example", DALI_DEMO_STR_TITLE_IMAGE_VIEW_ALPHA_BLENDING)); + demo.AddExample(Example("image-view-encoded-image-buffer.example", DALI_DEMO_STR_TITLE_IMAGE_VIEW_ENCODED_IMAGE_BUFFER)); demo.AddExample(Example("image-view-pixel-area.example", DALI_DEMO_STR_TITLE_IMAGE_VIEW_PIXEL_AREA)); demo.AddExample(Example("image-view-svg.example", DALI_DEMO_STR_TITLE_IMAGE_VIEW_SVG)); demo.AddExample(Example("image-view-url.example", DALI_DEMO_STR_TITLE_IMAGE_VIEW_URL)); diff --git a/examples/image-view-encoded-image-buffer/image-view-encoded-image-buffer-example.cpp b/examples/image-view-encoded-image-buffer/image-view-encoded-image-buffer-example.cpp new file mode 100644 index 0000000..aca1819 --- /dev/null +++ b/examples/image-view-encoded-image-buffer/image-view-encoded-image-buffer-example.cpp @@ -0,0 +1,239 @@ +/* + * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include "shared/view.h" + +using namespace Dali; +using namespace Dali::Toolkit; + +namespace +{ +const char* BACKGROUND_IMAGE(DEMO_IMAGE_DIR "background-gradient.jpg"); +const char* TOOLBAR_IMAGE(DEMO_IMAGE_DIR "top-bar.png"); +const char* APPLICATION_TITLE("Image view with encoded image buffer"); + +const char* IMAGE_PATH[] = { + DEMO_IMAGE_DIR "gallery-small-23.jpg", + DEMO_IMAGE_DIR "woodEffect.jpg", + DEMO_IMAGE_DIR "wood.png", // 32bits image +}; + +const unsigned int NUMBER_OF_RESOURCES = sizeof(IMAGE_PATH) / sizeof(char*); + +const unsigned int NUMBER_OF_IMAGES_ROW = 3; +const unsigned int NUMBER_OF_IMAGES_COLUMN = 2; +const unsigned int NUMBER_OF_IMAGES = NUMBER_OF_IMAGES_ROW * NUMBER_OF_IMAGES_COLUMN; + +constexpr Vector2 IMAGE_VIEW_SIZE(200.0f, 200.0f); + +const unsigned int TIMER_INTERVAL = 1000; // ms + +EncodedImageBuffer ConvertFileToEncodedImageBuffer(const char* url) +{ + EncodedImageBuffer buffer; + FILE *fp; + fp = fopen(url, "rb"); + if(fp != NULL) + { + fseek(fp, 0, SEEK_END); + size_t size = ftell(fp); + Dali::Vector data; + data.Resize(size); + fseek(fp, 0, SEEK_SET); + size_t realSize = fread(data.Begin(), size, sizeof(uint8_t), fp); + fclose(fp); + data.Resize(realSize); + buffer = EncodedImageBuffer::New(data); + } + return buffer; +} + +} // namespace + +class ImageViewEncodedImageBufferApp : public ConnectionTracker +{ +public: + ImageViewEncodedImageBufferApp(Application& application) + : mApplication(application) + { + // Connect to the Application's Init signal + mApplication.InitSignal().Connect(this, &ImageViewEncodedImageBufferApp::Create); + } + + ~ImageViewEncodedImageBufferApp() + { + // Nothing to do here + } + + void Create(Application& application) + { + // The Init signal is received once (only) during the Application lifetime + + ImageUrl backgroundImageUrl = Image::GenerateUrl(ConvertFileToEncodedImageBuffer(BACKGROUND_IMAGE)); + ImageUrl toolbarImageUrl = Image::GenerateUrl(ConvertFileToEncodedImageBuffer(TOOLBAR_IMAGE)); + + // Creates a default view with a default tool bar. + // The view is added to the window. + mContentLayer = DemoHelper::CreateView(application, + mView, + mToolBar, + backgroundImageUrl.GetUrl(), + toolbarImageUrl.GetUrl(), + APPLICATION_TITLE); + + // Initialize + mState = 0; + mImageIndex = 0; + UpdateImageUrl(); + UpdateImageViews(); + + // Create automatic unparent and create ticker. + mTimer = Timer::New(TIMER_INTERVAL); + mTimer.TickSignal().Connect(this, &ImageViewEncodedImageBufferApp::OnTick); + mTimer.Start(); + + application.GetWindow().GetRootLayer().TouchedSignal().Connect(this, &ImageViewEncodedImageBufferApp::OnTouch); + + application.GetWindow().KeyEventSignal().Connect(this, &ImageViewEncodedImageBufferApp::OnKeyEvent); + } + +private: + + void UpdateImageUrl() + { + mImageBuffer = ConvertFileToEncodedImageBuffer(IMAGE_PATH[mImageIndex]); + mImageUrl = Image::GenerateUrl(mImageBuffer); + } + void UpdateImageViews() + { + for(int i = 0; i < static_cast(NUMBER_OF_IMAGES_ROW); i++) + { + for(int j = 0; j < static_cast(NUMBER_OF_IMAGES_COLUMN); j++) + { + int viewId = i * NUMBER_OF_IMAGES_COLUMN + j; + // Remove old image and set null + if(mImageViews[viewId]) + { + mImageViews[viewId].Unparent(); + mImageViews[viewId] = ImageView(); // Set null image view + } + + bool needToCreate = true; + + // If current state don't wanna create current view, just skip + unsigned int currentViewState = 1u << ((i + j) & 1); + if(mState & currentViewState) + { + needToCreate = false; + } + + if(needToCreate) + { + mImageViews[viewId] = CreateImageView(i, j); + mContentLayer.Add(mImageViews[viewId]); + } + } + } + } + ImageView CreateImageView(int offset_y, int offset_x) + { + ImageView view = ImageView::New(); + view.SetProperty(Actor::Property::SIZE, IMAGE_VIEW_SIZE); + view.SetProperty(Actor::Property::POSITION, Vector2(IMAGE_VIEW_SIZE.x * offset_x, IMAGE_VIEW_SIZE.y * offset_y + mToolBar.GetNaturalSize().y)); + view.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT); + + Property::Map imagePropertyMap; + imagePropertyMap.Insert(Visual::Property::TYPE, Visual::IMAGE); + imagePropertyMap.Insert(ImageVisual::Property::URL, mImageUrl.GetUrl()); + + view.SetProperty(ImageView::Property::IMAGE, imagePropertyMap); + + return view; + } + + bool OnTick() + { + mState = (mState + 1) % 4; + UpdateImageViews(); + return true; // Keep tick always + } + + bool OnTouch(Actor actor, const TouchEvent& touch) + { + if(touch.GetState(0) == PointState::UP) + { + // Change resource + mImageIndex = (mImageIndex + 1) % NUMBER_OF_RESOURCES; + // Change resource's url + UpdateImageUrl(); + // Update image views + UpdateImageViews(); + } + return true; + } + + /** + * Main key event handler + */ + void OnKeyEvent(const KeyEvent& event) + { + if(event.GetState() == KeyEvent::DOWN) + { + if(IsKey(event, DALI_KEY_ESCAPE) || IsKey(event, DALI_KEY_BACK)) + { + if(mTimer.IsRunning()) + { + mTimer.Stop(); + mTimer.TickSignal().Disconnect(this, &ImageViewEncodedImageBufferApp::OnTick); + } + mApplication.Quit(); + } + } + } + +private: + Application& mApplication; + + Toolkit::Control mView; ///< The View instance. + Toolkit::ToolBar mToolBar; ///< The View's Toolbar. + Layer mContentLayer; ///< Content layer + + Toolkit::ImageView mImageViews[NUMBER_OF_IMAGES]; + + unsigned int mImageIndex; + EncodedImageBuffer mImageBuffer; + ImageUrl mImageUrl; + + // Automatic unparent and create ticker. + Timer mTimer; + unsigned int mState; ///< 0 : draw all images, 1 : draw half, 2 : draw another half, 3 : don't draw images. +}; + +int DALI_EXPORT_API main(int argc, char** argv) +{ + Application application = Application::New(&argc, &argv, DEMO_THEME_PATH); + ImageViewEncodedImageBufferApp test(application); + application.MainLoop(); + return 0; +} diff --git a/resources/po/en_GB.po b/resources/po/en_GB.po index 1d472d2..8f89fc0 100755 --- a/resources/po/en_GB.po +++ b/resources/po/en_GB.po @@ -109,6 +109,9 @@ msgstr "Image View" msgid "DALI_DEMO_STR_TITLE_IMAGE_VIEW_ALPHA_BLENDING" msgstr "Image View Alpha Blending" +msgid "DALI_DEMO_STR_TITLE_IMAGE_VIEW_ENCODED_IMAGE_BUFFER" +msgstr "Image View Encoded Image Buffer" + msgid "DALI_DEMO_STR_TITLE_IMAGE_VIEW_PIXEL_AREA" msgstr "Image View Pixel Area" diff --git a/resources/po/en_US.po b/resources/po/en_US.po index 729b67f..8afbc95 100755 --- a/resources/po/en_US.po +++ b/resources/po/en_US.po @@ -109,6 +109,9 @@ msgstr "Image View" msgid "DALI_DEMO_STR_TITLE_IMAGE_VIEW_ALPHA_BLENDING" msgstr "Image View Alpha Blending" +msgid "DALI_DEMO_STR_TITLE_IMAGE_VIEW_ENCODED_IMAGE_BUFFER" +msgstr "Image View Encoded Image Buffer" + msgid "DALI_DEMO_STR_TITLE_IMAGE_VIEW_PIXEL_AREA" msgstr "Image View Pixel Area" diff --git a/resources/po/ko.po b/resources/po/ko.po index d96a77d..e4b522a 100755 --- a/resources/po/ko.po +++ b/resources/po/ko.po @@ -67,6 +67,9 @@ msgstr "이미지 뷰" msgid "DALI_DEMO_STR_TITLE_IMAGE_VIEW_ALPHA_BLENDING" msgstr "이미지 뷰 알파 블렌딩" +msgid "DALI_DEMO_STR_TITLE_IMAGE_VIEW_ENCODED_IMAGE_BUFFER" +msgstr "이미지 뷰 인코딩 버퍼" + msgid "DALI_DEMO_STR_TITLE_IMAGE_VIEW_PIXEL_AREA" msgstr "이미지 뷰 픽셀 영역" diff --git a/shared/dali-demo-strings.h b/shared/dali-demo-strings.h index b0c7861..b5884dc 100644 --- a/shared/dali-demo-strings.h +++ b/shared/dali-demo-strings.h @@ -74,6 +74,7 @@ extern "C" #define DALI_DEMO_STR_TITLE_IMAGE_SCALING dgettext(DALI_DEMO_DOMAIN_LOCAL, "DALI_DEMO_STR_TITLE_IMAGE_SCALING") #define DALI_DEMO_STR_TITLE_IMAGE_VIEW dgettext(DALI_DEMO_DOMAIN_LOCAL, "DALI_DEMO_STR_TITLE_IMAGE_VIEW") #define DALI_DEMO_STR_TITLE_IMAGE_VIEW_ALPHA_BLENDING dgettext(DALI_DEMO_DOMAIN_LOCAL, "DALI_DEMO_STR_TITLE_IMAGE_VIEW_ALPHA_BLENDING") +#define DALI_DEMO_STR_TITLE_IMAGE_VIEW_ENCODED_IMAGE_BUFFER dgettext(DALI_DEMO_DOMAIN_LOCAL, "DALI_DEMO_STR_TITLE_IMAGE_VIEW_ENCODED_IMAGE_BUFFER") #define DALI_DEMO_STR_TITLE_IMAGE_VIEW_PIXEL_AREA dgettext(DALI_DEMO_DOMAIN_LOCAL, "DALI_DEMO_STR_TITLE_IMAGE_VIEW_PIXEL_AREA") #define DALI_DEMO_STR_TITLE_IMAGE_VIEW_SVG dgettext(DALI_DEMO_DOMAIN_LOCAL, "DALI_DEMO_STR_TITLE_IMAGE_VIEW_SVG") #define DALI_DEMO_STR_TITLE_IMAGE_VIEW_URL dgettext(DALI_DEMO_DOMAIN_LOCAL, "DALI_DEMO_STR_TITLE_IMAGE_VIEW_URL") @@ -180,6 +181,7 @@ extern "C" #define DALI_DEMO_STR_TITLE_IMAGE_SCALING "Image Scaling Grid" #define DALI_DEMO_STR_TITLE_IMAGE_VIEW "Image View" #define DALI_DEMO_STR_TITLE_IMAGE_VIEW_ALPHA_BLENDING "Image View Alpha Blending" +#define DALI_DEMO_STR_TITLE_IMAGE_VIEW_ENCODED_IMAGE_BUFFER "Image View Encoded Image Buffer" #define DALI_DEMO_STR_TITLE_IMAGE_VIEW_PIXEL_AREA "Image View Pixel Area" #define DALI_DEMO_STR_TITLE_IMAGE_VIEW_SVG "Image View SVG" #define DALI_DEMO_STR_TITLE_IMAGE_VIEW_URL "Image View URL"