Add Sample with Encoded Image Buffer 71/262071/2
authorEunki, Hong <eunkiki.hong@samsung.com>
Mon, 2 Aug 2021 08:11:51 +0000 (17:11 +0900)
committerEunki, Hong <eunkiki.hong@samsung.com>
Mon, 2 Aug 2021 10:09:34 +0000 (19:09 +0900)
Change-Id: I6addda2bdc0628f53ce113ff148e9ade7f75b63d
Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
examples-reel/dali-examples-reel.cpp
examples/image-view-encoded-image-buffer/image-view-encoded-image-buffer-example.cpp [new file with mode: 0644]
resources/po/en_GB.po
resources/po/en_US.po
resources/po/ko.po
shared/dali-demo-strings.h

index 5d137cb..e1ba60d 100644 (file)
@@ -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 (file)
index 0000000..aca1819
--- /dev/null
@@ -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 <dali-toolkit/dali-toolkit.h>
+#include <dali-toolkit/public-api/image-loader/image.h>
+#include <dali/public-api/adaptor-framework/encoded-image-buffer.h>
+#include <dali-toolkit/public-api/image-loader/image-url.h>
+#include <dali-toolkit/devel-api/visuals/image-visual-properties-devel.h>
+#include <dali/dali.h>
+#include <string>
+#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<uint8_t> 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<int>(NUMBER_OF_IMAGES_ROW); i++)
+    {
+      for(int j = 0; j < static_cast<int>(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;
+}
index 1d472d2..8f89fc0 100755 (executable)
@@ -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"
 
index 729b67f..8afbc95 100755 (executable)
@@ -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"
 
index d96a77d..e4b522a 100755 (executable)
@@ -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 "이미지 뷰 픽셀 영역"
 
index b0c7861..b5884dc 100644 (file)
@@ -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"