[EFL] Add ewk_view_device_pixel_ratio_set
authorryuan.choi@samsung.com <ryuan.choi@samsung.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 10 Jul 2013 03:32:35 +0000 (03:32 +0000)
committerryuan.choi@samsung.com <ryuan.choi@samsung.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 10 Jul 2013 03:32:35 +0000 (03:32 +0000)
https://bugs.webkit.org/show_bug.cgi?id=118521

Reviewed by Gyuyoung Kim.

Source/WebCore:

No new tests, covered by existing tests.

* dom/ViewportArguments.cpp: Remove PLATFORM(EFL) not to use deprecatedTargetDPI
* dom/ViewportArguments.h: Ditto.
* platform/efl/EflScreenUtilities.cpp: Removed getDPI() which is not used anymore.
* platform/efl/EflScreenUtilities.h: Ditto.

Source/WebKit/efl:

ewebkit and ewebkit2 have different approach about getting device pixel ratio.
ewebkit depends on deprecatedTargetDPI and ecore_x_dpi_get,
but ewebkit2 use Page::deviceScaleFactor.

This patch will add ewk_view_device_pixel_ratio_set and use Page::deviceScaleFactor()
instead of ViewportArguments::deprecatedTargetDPI like ewebkit2.

* ewk/ewk_view.cpp:
(_ewk_view_priv_new):
(_ewk_view_viewport_attributes_compute): Use Page::deviceScaleFactor().
(ewk_view_viewport_attributes_get): Ditto.
(ewk_view_device_pixel_ratio_set): Added.
(ewk_view_device_pixel_ratio_get):
* ewk/ewk_view.h:
Update document of ewk_view_device_pixel_ratio_get (from ewebkit2) and
added ewk_view_device_pixel_ratio_set.

Tools:

* EWebLauncher/main.c: Added new option(-r) to test device pixel ratio.
(windowCreate):
(parseUserArguments):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@152523 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/dom/ViewportArguments.cpp
Source/WebCore/dom/ViewportArguments.h
Source/WebCore/platform/efl/EflScreenUtilities.cpp
Source/WebCore/platform/efl/EflScreenUtilities.h
Source/WebKit/efl/ChangeLog
Source/WebKit/efl/ewk/ewk_view.cpp
Source/WebKit/efl/ewk/ewk_view.h
Tools/ChangeLog
Tools/EWebLauncher/main.c

index 5cbb1ac..5708b6c 100644 (file)
@@ -1,3 +1,17 @@
+2013-07-09  Ryuan Choi  <ryuan.choi@samsung.com>
+
+        [EFL] Add ewk_view_device_pixel_ratio_set
+        https://bugs.webkit.org/show_bug.cgi?id=118521
+
+        Reviewed by Gyuyoung Kim.
+
+        No new tests, covered by existing tests.
+
+        * dom/ViewportArguments.cpp: Remove PLATFORM(EFL) not to use deprecatedTargetDPI
+        * dom/ViewportArguments.h: Ditto.
+        * platform/efl/EflScreenUtilities.cpp: Removed getDPI() which is not used anymore.
+        * platform/efl/EflScreenUtilities.h: Ditto.
+
 2013-07-09  James Craig  <james@cookiecrook.com>
 
         @readonly and @aria-readonly="false" are not exposed correctly to accessibility
index 97ee9f7..918bb9c 100644 (file)
@@ -42,7 +42,7 @@ using namespace std;
 
 namespace WebCore {
 
-#if PLATFORM(BLACKBERRY) || PLATFORM(EFL) || PLATFORM(GTK) || PLATFORM(QT)
+#if PLATFORM(BLACKBERRY) || PLATFORM(GTK) || PLATFORM(QT)
 const float ViewportArguments::deprecatedTargetDPI = 160;
 #endif
 
index 5aa332b..65f3d57 100644 (file)
@@ -128,7 +128,7 @@ struct ViewportArguments {
         return !(*this == other);
     }
 
-#if PLATFORM(BLACKBERRY) || PLATFORM(EFL) || PLATFORM(GTK) || PLATFORM(QT)
+#if PLATFORM(BLACKBERRY) || PLATFORM(GTK) || PLATFORM(QT)
     // FIXME: We're going to keep this constant around until all embedders
     // refactor their code to no longer need it.
     static const float deprecatedTargetDPI;
index 763e609..133a1ac 100644 (file)
@@ -126,15 +126,6 @@ void applyFallbackCursor(Ecore_Evas* ecoreEvas, const char* cursorString)
 #endif
 }
 
-int getDPI()
-{
-#ifdef HAVE_ECORE_X
-    return ecore_x_dpi_get();
-#else
-    return 160;
-#endif
-}
-
 bool isUsingEcoreX(const Evas* evas)
 {
 #ifdef HAVE_ECORE_X
index e913057..67fb0f0 100644 (file)
@@ -30,7 +30,6 @@ typedef struct _Evas Evas;
 namespace WebCore {
 
 void applyFallbackCursor(Ecore_Evas*, const char*);
-int getDPI();
 bool isUsingEcoreX(const Evas*);
 
 } // namespace WebCore
index 175fdaf..ae9d60f 100644 (file)
@@ -1,3 +1,27 @@
+2013-07-09  Ryuan Choi  <ryuan.choi@samsung.com>
+
+        [EFL] Add ewk_view_device_pixel_ratio_set
+        https://bugs.webkit.org/show_bug.cgi?id=118521
+
+        Reviewed by Gyuyoung Kim.
+
+        ewebkit and ewebkit2 have different approach about getting device pixel ratio.
+        ewebkit depends on deprecatedTargetDPI and ecore_x_dpi_get,
+        but ewebkit2 use Page::deviceScaleFactor.
+
+        This patch will add ewk_view_device_pixel_ratio_set and use Page::deviceScaleFactor()
+        instead of ViewportArguments::deprecatedTargetDPI like ewebkit2.
+
+        * ewk/ewk_view.cpp:
+        (_ewk_view_priv_new):
+        (_ewk_view_viewport_attributes_compute): Use Page::deviceScaleFactor().
+        (ewk_view_viewport_attributes_get): Ditto.
+        (ewk_view_device_pixel_ratio_set): Added.
+        (ewk_view_device_pixel_ratio_get):
+        * ewk/ewk_view.h:
+        Update document of ewk_view_device_pixel_ratio_get (from ewebkit2) and
+        added ewk_view_device_pixel_ratio_set.
+
 2013-06-27  Kangil Han  <kangil.han@samsung.com>
 
         Adopt is/toHTMLInputElement for code cleanup
index c9a9561..6dcb694 100644 (file)
 static const float zoomMinimum = 0.05;
 static const float zoomMaximum = 4.0;
 
-static const float devicePixelRatio = 1.0;
-
 static const char ewkViewTypeString[] = "EWK_View";
 
 static const size_t ewkViewRepaintsSizeInitial = 32;
@@ -342,7 +340,6 @@ struct _Ewk_View_Private_Data {
             float maxScale;
             Eina_Bool userScalable : 1;
         } zoomRange;
-        float devicePixelRatio;
         double domTimerInterval;
         bool allowUniversalAccessFromFileURLs : 1;
         bool allowFileAccessFromFileURLs : 1;
@@ -842,7 +839,6 @@ static Ewk_View_Private_Data* _ewk_view_priv_new(Ewk_View_Smart_Data* smartData)
     priv->settings.zoomRange.minScale = zoomMinimum;
     priv->settings.zoomRange.maxScale = zoomMaximum;
     priv->settings.zoomRange.userScalable = true;
-    priv->settings.devicePixelRatio = devicePixelRatio;
 
     priv->settings.domTimerInterval = priv->pageSettings->defaultMinDOMTimerInterval();
 
@@ -1239,14 +1235,11 @@ static void _ewk_view_zoom_animation_start(Ewk_View_Smart_Data* smartData)
 static WebCore::ViewportAttributes _ewk_view_viewport_attributes_compute(Ewk_View_Private_Data* priv)
 {
     int desktopWidth = 980;
-    int deviceDPI = WebCore::getDPI();
-    priv->settings.devicePixelRatio = deviceDPI / WebCore::ViewportArguments::deprecatedTargetDPI;
-
     WebCore::IntRect availableRect = enclosingIntRect(priv->page->chrome().client()->pageRect());
     WebCore::IntRect deviceRect = enclosingIntRect(priv->page->chrome().client()->windowRect());
 
-    WebCore::ViewportAttributes attributes = WebCore::computeViewportAttributes(priv->viewportArguments, desktopWidth, deviceRect.width(), deviceRect.height(), priv->settings.devicePixelRatio, availableRect.size());
-    WebCore::restrictMinimumScaleFactorToViewportSize(attributes, availableRect.size(), priv->settings.devicePixelRatio);
+    WebCore::ViewportAttributes attributes = WebCore::computeViewportAttributes(priv->viewportArguments, desktopWidth, deviceRect.width(), deviceRect.height(), priv->page->deviceScaleFactor(), availableRect.size());
+    WebCore::restrictMinimumScaleFactorToViewportSize(attributes, availableRect.size(), priv->page->deviceScaleFactor());
     WebCore::restrictScaleFactorToInitialScaleIfNotUserScalable(attributes);
 
     return attributes;
@@ -3940,7 +3933,7 @@ void ewk_view_viewport_attributes_get(const Evas_Object* ewkView, int* width, in
     if (minScale)
         *minScale = attributes.minimumScale;
     if (devicePixelRatio)
-        *devicePixelRatio = priv->settings.devicePixelRatio;
+        *devicePixelRatio = priv->page->deviceScaleFactor();
     if (userScalable)
         *userScalable = static_cast<bool>(attributes.userScalable);
 }
@@ -3995,12 +3988,22 @@ Eina_Bool ewk_view_user_scalable_get(const Evas_Object* ewkView)
     return priv->settings.zoomRange.userScalable;
 }
 
+Eina_Bool ewk_view_device_pixel_ratio_set(Evas_Object* ewkView, float ratio)
+{
+    EWK_VIEW_SD_GET_OR_RETURN(ewkView, smartData, false);
+    EWK_VIEW_PRIV_GET_OR_RETURN(smartData, priv, false);
+
+    priv->page->setDeviceScaleFactor(ratio);
+
+    return true;
+}
+
 float ewk_view_device_pixel_ratio_get(const Evas_Object* ewkView)
 {
     EWK_VIEW_SD_GET_OR_RETURN(ewkView, smartData, -1.0);
     EWK_VIEW_PRIV_GET_OR_RETURN(smartData, priv, -1.0);
 
-    return priv->settings.devicePixelRatio;
+    return priv->page->deviceScaleFactor();
 }
 
 void ewk_view_text_direction_set(Evas_Object* ewkView, Ewk_Text_Direction direction)
index 3c65ec1..eb3c74e 100644 (file)
@@ -2422,15 +2422,55 @@ EAPI Eina_Bool ewk_view_user_scalable_set(Evas_Object *o, Eina_Bool user_scalabl
 EAPI Eina_Bool ewk_view_user_scalable_get(const Evas_Object *o);
 
 /**
- * Gets the device pixel ratio value.
+ * Queries the ratio between the CSS units and device pixels when the content is unscaled.
  *
- * @param o view to get the device pixel ratio value
+ * When designing touch-friendly contents, knowing the approximated target size on a device
+ * is important for contents providers in order to get the intented layout and element
+ * sizes.
  *
- * @return the device pixel ratio value on success or @c -1.0 on failure
+ * As most first generation touch devices had a PPI of approximately 160, this became a
+ * de-facto value, when used in conjunction with the viewport meta tag.
+ *
+ * Devices with a higher PPI learning towards 240 or 320, applies a pre-scaling on all
+ * content, of either 1.5 or 2.0, not affecting the CSS scale or pinch zooming.
+ *
+ * This value can be set using this property and it is exposed to CSS media queries using
+ * the -webkit-device-pixel-ratio query.
+ *
+ * For instance, if you want to load an image without having it upscaled on a web view
+ * using a device pixel ratio of 2.0 it can be done by loading an image of say 100x100
+ * pixels but showing it at half the size.
+ *
+ * @media (-webkit-min-device-pixel-ratio: 1.5) {
+ *     .icon {
+ *         width: 50px;
+ *         height: 50px;
+ *         url: "/images/icon@2x.png"; // This is actually a 100x100 image
+ *     }
+ * }
+ *
+ * If the above is used on a device with device pixel ratio of 1.5, it will be scaled
+ * down but still provide a better looking image.
+ *
+ * @param o view object to get device pixel ratio
+ *
+ * @return the ratio between the CSS units and device pixels,
+ *         or @c -1.0 on failure
  */
 EAPI float ewk_view_device_pixel_ratio_get(const Evas_Object *o);
 
 /**
+ * Sets the ratio between the CSS units and device pixels when the content is unscaled.
+ *
+ * @param o view object to set device pixel ratio
+ *
+ * @return @c EINA_TRUE if the device pixel ratio was set, @c EINA_FALSE otherwise
+ *
+ * @see ewk_view_device_pixel_ratio_get()
+ */
+EAPI Eina_Bool ewk_view_device_pixel_ratio_set(Evas_Object *o, float ratio);
+
+/**
  * Changes the text direction of the selected input node.
  *
  * @param o view object to set text direction.
index c61b5ae..214c5f7 100644 (file)
@@ -1,3 +1,14 @@
+2013-07-09  Ryuan Choi  <ryuan.choi@samsung.com>
+
+        [EFL] Add ewk_view_device_pixel_ratio_set
+        https://bugs.webkit.org/show_bug.cgi?id=118521
+
+        Reviewed by Gyuyoung Kim.
+
+        * EWebLauncher/main.c: Added new option(-r) to test device pixel ratio.
+        (windowCreate):
+        (parseUserArguments):
+
 2013-07-09  Bruno de Oliveira Abinader  <brunoabinader@gmail.com>
 
         Unreviewed change of my email addresses.
index 5c833e9..b9b5b52 100644 (file)
@@ -115,6 +115,8 @@ static const Ecore_Getopt options = {
              ecore_getopt_callback_ecore_evas_list_engines, NULL),
         ECORE_GETOPT_CHOICE
             ('b', "backing-store", "choose backing store to use.", backingStores),
+        ECORE_GETOPT_STORE_DOUBLE
+            ('r', "device-pixel-ratio", "Ratio between the CSS units and device pixels."),
         ECORE_GETOPT_STORE_DEF_BOOL
             ('c', "encoding-detector", "enable/disable encoding detector", 0),
         ECORE_GETOPT_STORE_DEF_BOOL
@@ -148,6 +150,7 @@ typedef struct _User_Arguments {
     char *engine;
     Eina_Bool quitOption;
     char *backingStore;
+    float device_pixel_ratio;
     Eina_Bool enableEncodingDetector;
     Eina_Bool enableTiledBackingStore;
     Eina_Bool isFlattening;
@@ -863,6 +866,7 @@ windowCreate(User_Arguments *userArgs)
     ewk_view_setting_local_storage_database_path_set(app->browser, userArgs->databasePath);
     ewk_view_setting_enable_frame_flattening_set(app->browser, userArgs->isFlattening);
     ewk_view_setting_encoding_detector_set(app->browser, userArgs->enableEncodingDetector);
+    ewk_view_device_pixel_ratio_set(app->browser, userArgs->device_pixel_ratio);
 
     app->userArgs = userArgs;
     app->url_bar = NULL;
@@ -938,6 +942,7 @@ parseUserArguments(int argc, char *argv[], User_Arguments *userArgs)
     userArgs->engine = NULL;
     userArgs->quitOption = EINA_FALSE;
     userArgs->backingStore = (char *)backingStores[1];
+    userArgs->device_pixel_ratio = 1.0;
     userArgs->enableEncodingDetector = EINA_FALSE;
     userArgs->enableTiledBackingStore = EINA_FALSE;
     userArgs->isFlattening = EINA_FALSE;
@@ -953,6 +958,7 @@ parseUserArguments(int argc, char *argv[], User_Arguments *userArgs)
         ECORE_GETOPT_VALUE_STR(userArgs->engine),
         ECORE_GETOPT_VALUE_BOOL(userArgs->quitOption),
         ECORE_GETOPT_VALUE_STR(userArgs->backingStore),
+        ECORE_GETOPT_VALUE_DOUBLE(userArgs->device_pixel_ratio),
         ECORE_GETOPT_VALUE_BOOL(userArgs->enableEncodingDetector),
         ECORE_GETOPT_VALUE_BOOL(userArgs->isFlattening),
         ECORE_GETOPT_VALUE_BOOL(userArgs->isFullscreen),