Scale the GUI to fit the screen

With this patch set, if needed, we scale the images during early
boot. TTF support is needed to properly scale the font. No font
scaling is done on the old style fixed width font used in the
console.

Special thanks to _that for figuring out the scaling and blending
function calls to make this possible.

Change-Id: If2f79bef16d6db2e1298bfc3d00c9bcca2bee37a
This commit is contained in:
Ethan Yonker
2015-02-10 14:11:50 -06:00
parent 1b6199f8ed
commit 63e414fc8a
34 changed files with 399 additions and 150 deletions
+3
View File
@@ -63,6 +63,9 @@ endif
ifneq ($(TW_Y_OFFSET),)
LOCAL_CFLAGS += -DTW_Y_OFFSET=$(TW_Y_OFFSET)
endif
ifeq ($(TW_ROUND_SCREEN), true)
LOCAL_CFLAGS += -DTW_ROUND_SCREEN
endif
ifeq ($(DEVICE_RESOLUTION),)
$(warning ********************************************************************************)
+5 -5
View File
@@ -22,10 +22,10 @@
<resource name="progress" type="animation" filename="indeterminate" />
<resource name="progress_empty" type="image" filename="progress_empty" />
<resource name="progress_full" type="image" filename="progress_fill" />
<resource name="checkbox_false" type="image" filename="checkbox_empty" />
<resource name="checkbox_true" type="image" filename="checkbox_checked" />
<resource name="radio_false" type="image" filename="radio_empty" />
<resource name="radio_true" type="image" filename="radio_selected" />
<resource name="checkbox_false" type="image" filename="checkbox_empty" retainaspect="1" />
<resource name="checkbox_true" type="image" filename="checkbox_checked" retainaspect="1" />
<resource name="radio_false" type="image" filename="radio_empty" retainaspect="1" />
<resource name="radio_true" type="image" filename="radio_selected" retainaspect="1" />
<resource name="medium_button" type="image" filename="medium-button" />
<resource name="mediumwide_button" type="image" filename="mediumwide-button" />
<resource name="sort_button" type="image" filename="sort-button" />
@@ -42,7 +42,7 @@
<resource name="keyboard2" type="image" filename="keyboard2" />
<resource name="keyboard3" type="image" filename="keyboard3" />
<resource name="keyboard4" type="image" filename="keyboard4" />
<resource name="cursor" type="image" filename="cursor" />
<resource name="cursor" type="image" filename="cursor" retainaspect="1" />
</resources>
<variables>
+5 -5
View File
@@ -22,10 +22,10 @@
<resource name="progress" type="animation" filename="indeterminate" />
<resource name="progress_empty" type="image" filename="progress_empty" />
<resource name="progress_full" type="image" filename="progress_fill" />
<resource name="checkbox_false" type="image" filename="checkbox_empty" />
<resource name="checkbox_true" type="image" filename="checkbox_checked" />
<resource name="radio_false" type="image" filename="radio_empty" />
<resource name="radio_true" type="image" filename="radio_selected" />
<resource name="checkbox_false" type="image" filename="checkbox_empty" retainaspect="1" />
<resource name="checkbox_true" type="image" filename="checkbox_checked" retainaspect="1" />
<resource name="radio_false" type="image" filename="radio_empty" retainaspect="1" />
<resource name="radio_true" type="image" filename="radio_selected" retainaspect="1" />
<resource name="medium_button" type="image" filename="medium-button" />
<resource name="mediumwide_button" type="image" filename="mediumwide-button" />
<resource name="sort_button" type="image" filename="sort-button" />
@@ -42,7 +42,7 @@
<resource name="keyboard2" type="image" filename="keyboard2" />
<resource name="keyboard3" type="image" filename="keyboard3" />
<resource name="keyboard4" type="image" filename="keyboard4" />
<resource name="cursor" type="image" filename="cursor" />
<resource name="cursor" type="image" filename="cursor" retainaspect="1" />
</resources>
<variables>
+5 -5
View File
@@ -25,10 +25,10 @@
<resource name="progress" type="animation" filename="indeterminate" />
<resource name="progress_empty" type="image" filename="progress_empty" />
<resource name="progress_full" type="image" filename="progress_fill" />
<resource name="checkbox_false" type="image" filename="checkbox_empty" />
<resource name="checkbox_true" type="image" filename="checkbox_checked" />
<resource name="radio_false" type="image" filename="radio_empty" />
<resource name="radio_true" type="image" filename="radio_selected" />
<resource name="checkbox_false" type="image" filename="checkbox_empty" retainaspect="1" />
<resource name="checkbox_true" type="image" filename="checkbox_checked" retainaspect="1" />
<resource name="radio_false" type="image" filename="radio_empty" retainaspect="1" />
<resource name="radio_true" type="image" filename="radio_selected" retainaspect="1" />
<resource name="medium_button" type="image" filename="medium-button" />
<resource name="sort_button" type="image" filename="sort-button" />
<resource name="minus_button" type="image" filename="minus-button" />
@@ -43,7 +43,7 @@
<resource name="keyboard2" type="image" filename="keyboard2" />
<resource name="keyboard3" type="image" filename="keyboard3" />
<resource name="keyboard4" type="image" filename="keyboard4" />
<resource name="cursor" type="image" filename="cursor" />
<resource name="cursor" type="image" filename="cursor" retainaspect="1" />
</resources>
<variables>
+5 -5
View File
@@ -25,10 +25,10 @@
<resource name="progress" type="animation" filename="indeterminate" />
<resource name="progress_empty" type="image" filename="progress_empty" />
<resource name="progress_full" type="image" filename="progress_fill" />
<resource name="checkbox_false" type="image" filename="checkbox_empty" />
<resource name="checkbox_true" type="image" filename="checkbox_checked" />
<resource name="radio_false" type="image" filename="radio_empty" />
<resource name="radio_true" type="image" filename="radio_selected" />
<resource name="checkbox_false" type="image" filename="checkbox_empty" retainaspect="1" />
<resource name="checkbox_true" type="image" filename="checkbox_checked" retainaspect="1" />
<resource name="radio_false" type="image" filename="radio_empty" retainaspect="1" />
<resource name="radio_true" type="image" filename="radio_selected" retainaspect="1" />
<resource name="medium_button" type="image" filename="medium-button" />
<resource name="sort_button" type="image" filename="sort-button" />
<resource name="minus_button" type="image" filename="minus-button" />
@@ -43,7 +43,7 @@
<resource name="keyboard2" type="image" filename="keyboard2" />
<resource name="keyboard3" type="image" filename="keyboard3" />
<resource name="keyboard4" type="image" filename="keyboard4" />
<resource name="cursor" type="image" filename="cursor" />
<resource name="cursor" type="image" filename="cursor" retainaspect="1" />
</resources>
<variables>
+5 -5
View File
@@ -22,10 +22,10 @@
<resource name="progress" type="animation" filename="indeterminate" />
<resource name="progress_empty" type="image" filename="progress_empty" />
<resource name="progress_full" type="image" filename="progress_fill" />
<resource name="checkbox_false" type="image" filename="checkbox_empty" />
<resource name="checkbox_true" type="image" filename="checkbox_checked" />
<resource name="radio_false" type="image" filename="radio_empty" />
<resource name="radio_true" type="image" filename="radio_selected" />
<resource name="checkbox_false" type="image" filename="checkbox_empty" retainaspect="1" />
<resource name="checkbox_true" type="image" filename="checkbox_checked" retainaspect="1" />
<resource name="radio_false" type="image" filename="radio_empty" retainaspect="1" />
<resource name="radio_true" type="image" filename="radio_selected" retainaspect="1" />
<resource name="medium_button" type="image" filename="medium-button" />
<resource name="mediumwide_button" type="image" filename="mediumwide-button" />
<resource name="sort_button" type="image" filename="sort-button" />
@@ -42,7 +42,7 @@
<resource name="keyboard2" type="image" filename="keyboard2" />
<resource name="keyboard3" type="image" filename="keyboard3" />
<resource name="keyboard4" type="image" filename="keyboard4" />
<resource name="cursor" type="image" filename="cursor" />
<resource name="cursor" type="image" filename="cursor" retainaspect="1" />
</resources>
<variables>
+5 -5
View File
@@ -25,10 +25,10 @@
<resource name="progress" type="animation" filename="indeterminate" />
<resource name="progress_empty" type="image" filename="progress_empty" />
<resource name="progress_full" type="image" filename="progress_fill" />
<resource name="checkbox_false" type="image" filename="checkbox_empty" />
<resource name="checkbox_true" type="image" filename="checkbox_checked" />
<resource name="radio_false" type="image" filename="radio_empty" />
<resource name="radio_true" type="image" filename="radio_selected" />
<resource name="checkbox_false" type="image" filename="checkbox_empty" retainaspect="1" />
<resource name="checkbox_true" type="image" filename="checkbox_checked" retainaspect="1" />
<resource name="radio_false" type="image" filename="radio_empty" retainaspect="1" />
<resource name="radio_true" type="image" filename="radio_selected" retainaspect="1" />
<resource name="medium_button" type="image" filename="medium-button" />
<resource name="sort_button" type="image" filename="sort-button" />
<resource name="minus_button" type="image" filename="minus-button" />
@@ -43,7 +43,7 @@
<resource name="keyboard2" type="image" filename="keyboard2" />
<resource name="keyboard3" type="image" filename="keyboard3" />
<resource name="keyboard4" type="image" filename="keyboard4" />
<resource name="cursor" type="image" filename="cursor" />
<resource name="cursor" type="image" filename="cursor" retainaspect="1" />
</resources>
<variables>
+5 -5
View File
@@ -25,10 +25,10 @@
<resource name="progress" type="animation" filename="indeterminate" />
<resource name="progress_empty" type="image" filename="progress_empty" />
<resource name="progress_full" type="image" filename="progress_fill" />
<resource name="checkbox_false" type="image" filename="checkbox_empty" />
<resource name="checkbox_true" type="image" filename="checkbox_checked" />
<resource name="radio_false" type="image" filename="radio_empty" />
<resource name="radio_true" type="image" filename="radio_selected" />
<resource name="checkbox_false" type="image" filename="checkbox_empty" retainaspect="1" />
<resource name="checkbox_true" type="image" filename="checkbox_checked" retainaspect="1" />
<resource name="radio_false" type="image" filename="radio_empty" retainaspect="1" />
<resource name="radio_true" type="image" filename="radio_selected" retainaspect="1" />
<resource name="medium_button" type="image" filename="medium-button" />
<resource name="sort_button" type="image" filename="sort-button" />
<resource name="minus_button" type="image" filename="minus-button" />
@@ -43,7 +43,7 @@
<resource name="keyboard2" type="image" filename="keyboard2" />
<resource name="keyboard3" type="image" filename="keyboard3" />
<resource name="keyboard4" type="image" filename="keyboard4" />
<resource name="cursor" type="image" filename="cursor" />
<resource name="cursor" type="image" filename="cursor" retainaspect="1" />
</resources>
<variables>
+5 -5
View File
@@ -22,10 +22,10 @@
<resource name="progress" type="animation" filename="indeterminate" />
<resource name="progress_empty" type="image" filename="progress_empty" />
<resource name="progress_full" type="image" filename="progress_fill" />
<resource name="checkbox_false" type="image" filename="checkbox_empty" />
<resource name="checkbox_true" type="image" filename="checkbox_checked" />
<resource name="radio_false" type="image" filename="radio_empty" />
<resource name="radio_true" type="image" filename="radio_selected" />
<resource name="checkbox_false" type="image" filename="checkbox_empty" retainaspect="1" />
<resource name="checkbox_true" type="image" filename="checkbox_checked" retainaspect="1" />
<resource name="radio_false" type="image" filename="radio_empty" retainaspect="1" />
<resource name="radio_true" type="image" filename="radio_selected" retainaspect="1" />
<resource name="medium_button" type="image" filename="medium-button" />
<resource name="mediumwide_button" type="image" filename="mediumwide-button" />
<resource name="sort_button" type="image" filename="sort-button" />
@@ -42,7 +42,7 @@
<resource name="keyboard2" type="image" filename="keyboard2" />
<resource name="keyboard3" type="image" filename="keyboard3" />
<resource name="keyboard4" type="image" filename="keyboard4" />
<resource name="cursor" type="image" filename="cursor" />
<resource name="cursor" type="image" filename="cursor" retainaspect="1" />
</resources>
<variables>
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

+6 -4
View File
@@ -3,6 +3,7 @@
<recovery>
<details>
<resolution width="240" height="240" />
<roundscreen offset_x="30" offset_y="30" />
<author>masteroftime</author>
<title>TWRP x201</title>
<description>tDPI Smartwatch Theme</description>
@@ -25,10 +26,10 @@
<resource name="progress" type="animation" filename="indeterminate" />
<resource name="progress_empty" type="image" filename="progress_empty" />
<resource name="progress_full" type="image" filename="progress_fill" />
<resource name="checkbox_false" type="image" filename="checkbox_empty" />
<resource name="checkbox_true" type="image" filename="checkbox_checked" />
<resource name="radio_false" type="image" filename="radio_empty" />
<resource name="radio_true" type="image" filename="radio_selected" />
<resource name="checkbox_false" type="image" filename="checkbox_empty" retainaspect="1" />
<resource name="checkbox_true" type="image" filename="checkbox_checked" retainaspect="1" />
<resource name="radio_false" type="image" filename="radio_empty" retainaspect="1" />
<resource name="radio_true" type="image" filename="radio_selected" retainaspect="1" />
<resource name="medium_button" type="image" filename="medium-button" />
<resource name="sort_button" type="image" filename="sort-button" />
<resource name="minus_button" type="image" filename="minus-button" />
@@ -43,6 +44,7 @@
<resource name="keyboard2" type="image" filename="keyboard2" />
<resource name="keyboard3" type="image" filename="keyboard3" />
<resource name="keyboard4" type="image" filename="keyboard4" />
<resource name="cursor" type="image" filename="cursor" retainaspect="1" />
</resources>
<variables>
+5 -5
View File
@@ -22,10 +22,10 @@
<resource name="progress" type="animation" filename="indeterminate" />
<resource name="progress_empty" type="image" filename="progress_empty" />
<resource name="progress_full" type="image" filename="progress_fill" />
<resource name="checkbox_false" type="image" filename="checkbox_empty" />
<resource name="checkbox_true" type="image" filename="checkbox_checked" />
<resource name="radio_false" type="image" filename="radio_empty" />
<resource name="radio_true" type="image" filename="radio_selected" />
<resource name="checkbox_false" type="image" filename="checkbox_empty" retainaspect="1" />
<resource name="checkbox_true" type="image" filename="checkbox_checked" retainaspect="1" />
<resource name="radio_false" type="image" filename="radio_empty" retainaspect="1" />
<resource name="radio_true" type="image" filename="radio_selected" retainaspect="1" />
<resource name="medium_button" type="image" filename="medium-button" />
<resource name="mediumwide_button" type="image" filename="mediumwide-button" />
<resource name="sort_button" type="image" filename="sort-button" />
@@ -42,7 +42,7 @@
<resource name="keyboard2" type="image" filename="keyboard2" />
<resource name="keyboard3" type="image" filename="keyboard3" />
<resource name="keyboard4" type="image" filename="keyboard4" />
<resource name="cursor" type="image" filename="cursor" />
<resource name="cursor" type="image" filename="cursor" retainaspect="1" />
</resources>
<variables>
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

+6 -4
View File
@@ -3,6 +3,7 @@
<recovery>
<details>
<resolution width="280" height="280" />
<roundscreen offset_x="35" offset_y="35" />
<author>TeamWin</author>
<title>Backup Naowz</title>
<description>Default basic theme</description>
@@ -25,10 +26,10 @@
<resource name="progress" type="animation" filename="indeterminate" />
<resource name="progress_empty" type="image" filename="progress_empty" />
<resource name="progress_full" type="image" filename="progress_fill" />
<resource name="checkbox_false" type="image" filename="checkbox_empty" />
<resource name="checkbox_true" type="image" filename="checkbox_checked" />
<resource name="radio_false" type="image" filename="radio_empty" />
<resource name="radio_true" type="image" filename="radio_selected" />
<resource name="checkbox_false" type="image" filename="checkbox_empty" retainaspect="1" />
<resource name="checkbox_true" type="image" filename="checkbox_checked" retainaspect="1" />
<resource name="radio_false" type="image" filename="radio_empty" retainaspect="1" />
<resource name="radio_true" type="image" filename="radio_selected" retainaspect="1" />
<resource name="medium_button" type="image" filename="medium-button" />
<resource name="sort_button" type="image" filename="sort-button" />
<resource name="minus_button" type="image" filename="minus-button" />
@@ -43,6 +44,7 @@
<resource name="keyboard2" type="image" filename="keyboard2" />
<resource name="keyboard3" type="image" filename="keyboard3" />
<resource name="keyboard4" type="image" filename="keyboard4" />
<resource name="cursor" type="image" filename="cursor" retainaspect="1" />
</resources>
<variables>
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

+6 -4
View File
@@ -3,6 +3,7 @@
<recovery>
<details>
<resolution width="320" height="320" />
<roundscreen offset_x="40" offset_y="40" />
<author>TeamWin</author>
<title>Backup Naowz</title>
<description>Default basic theme</description>
@@ -25,10 +26,10 @@
<resource name="progress" type="animation" filename="indeterminate" />
<resource name="progress_empty" type="image" filename="progress_empty" />
<resource name="progress_full" type="image" filename="progress_fill" />
<resource name="checkbox_false" type="image" filename="checkbox_empty" />
<resource name="checkbox_true" type="image" filename="checkbox_checked" />
<resource name="radio_false" type="image" filename="radio_empty" />
<resource name="radio_true" type="image" filename="radio_selected" />
<resource name="checkbox_false" type="image" filename="checkbox_empty" retainaspect="1" />
<resource name="checkbox_true" type="image" filename="checkbox_checked" retainaspect="1" />
<resource name="radio_false" type="image" filename="radio_empty" retainaspect="1" />
<resource name="radio_true" type="image" filename="radio_selected" retainaspect="1" />
<resource name="medium_button" type="image" filename="medium-button" />
<resource name="sort_button" type="image" filename="sort-button" />
<resource name="minus_button" type="image" filename="minus-button" />
@@ -43,6 +44,7 @@
<resource name="keyboard2" type="image" filename="keyboard2" />
<resource name="keyboard3" type="image" filename="keyboard3" />
<resource name="keyboard4" type="image" filename="keyboard4" />
<resource name="cursor" type="image" filename="cursor" retainaspect="1" />
</resources>
<variables>
+5 -5
View File
@@ -25,10 +25,10 @@
<resource name="progress" type="animation" filename="indeterminate" />
<resource name="progress_empty" type="image" filename="progress_empty" />
<resource name="progress_full" type="image" filename="progress_fill" />
<resource name="checkbox_false" type="image" filename="checkbox_empty" />
<resource name="checkbox_true" type="image" filename="checkbox_checked" />
<resource name="radio_false" type="image" filename="radio_empty" />
<resource name="radio_true" type="image" filename="radio_selected" />
<resource name="checkbox_false" type="image" filename="checkbox_empty" retainaspect="1" />
<resource name="checkbox_true" type="image" filename="checkbox_checked" retainaspect="1" />
<resource name="radio_false" type="image" filename="radio_empty" retainaspect="1" />
<resource name="radio_true" type="image" filename="radio_selected" retainaspect="1" />
<resource name="medium_button" type="image" filename="medium-button" />
<resource name="sort_button" type="image" filename="sort-button" />
<resource name="minus_button" type="image" filename="minus-button" />
@@ -43,7 +43,7 @@
<resource name="keyboard2" type="image" filename="keyboard2" />
<resource name="keyboard3" type="image" filename="keyboard3" />
<resource name="keyboard4" type="image" filename="keyboard4" />
<resource name="cursor" type="image" filename="cursor" />
<resource name="cursor" type="image" filename="cursor" retainaspect="1" />
</resources>
<variables>
+5 -5
View File
@@ -25,10 +25,10 @@
<resource name="progress" type="animation" filename="indeterminate" />
<resource name="progress_empty" type="image" filename="progress_empty" />
<resource name="progress_full" type="image" filename="progress_fill" />
<resource name="checkbox_false" type="image" filename="checkbox_empty" />
<resource name="checkbox_true" type="image" filename="checkbox_checked" />
<resource name="radio_false" type="image" filename="radio_empty" />
<resource name="radio_true" type="image" filename="radio_selected" />
<resource name="checkbox_false" type="image" filename="checkbox_empty" retainaspect="1" />
<resource name="checkbox_true" type="image" filename="checkbox_checked" retainaspect="1" />
<resource name="radio_false" type="image" filename="radio_empty" retainaspect="1" />
<resource name="radio_true" type="image" filename="radio_selected" retainaspect="1" />
<resource name="medium_button" type="image" filename="medium-button" />
<resource name="sort_button" type="image" filename="sort-button" />
<resource name="minus_button" type="image" filename="minus-button" />
@@ -43,7 +43,7 @@
<resource name="keyboard2" type="image" filename="keyboard2" />
<resource name="keyboard3" type="image" filename="keyboard3" />
<resource name="keyboard4" type="image" filename="keyboard4" />
<resource name="cursor" type="image" filename="cursor" />
<resource name="cursor" type="image" filename="cursor" retainaspect="1" />
</resources>
<variables>
+5 -5
View File
@@ -25,10 +25,10 @@
<resource name="progress" type="animation" filename="indeterminate" />
<resource name="progress_empty" type="image" filename="progress_empty" />
<resource name="progress_full" type="image" filename="progress_fill" />
<resource name="checkbox_false" type="image" filename="checkbox_empty" />
<resource name="checkbox_true" type="image" filename="checkbox_checked" />
<resource name="radio_false" type="image" filename="radio_empty" />
<resource name="radio_true" type="image" filename="radio_selected" />
<resource name="checkbox_false" type="image" filename="checkbox_empty" retainaspect="1" />
<resource name="checkbox_true" type="image" filename="checkbox_checked" retainaspect="1" />
<resource name="radio_false" type="image" filename="radio_empty" retainaspect="1" />
<resource name="radio_true" type="image" filename="radio_selected" retainaspect="1" />
<resource name="medium_button" type="image" filename="medium-button" />
<resource name="sort_button" type="image" filename="sort-button" />
<resource name="minus_button" type="image" filename="minus-button" />
@@ -43,7 +43,7 @@
<resource name="keyboard2" type="image" filename="keyboard2" />
<resource name="keyboard3" type="image" filename="keyboard3" />
<resource name="keyboard4" type="image" filename="keyboard4" />
<resource name="cursor" type="image" filename="cursor" />
<resource name="cursor" type="image" filename="cursor" retainaspect="1" />
</resources>
<variables>
+5 -5
View File
@@ -25,10 +25,10 @@
<resource name="progress" type="animation" filename="indeterminate" />
<resource name="progress_empty" type="image" filename="progress_empty" />
<resource name="progress_full" type="image" filename="progress_fill" />
<resource name="checkbox_false" type="image" filename="checkbox_empty" />
<resource name="checkbox_true" type="image" filename="checkbox_checked" />
<resource name="radio_false" type="image" filename="radio_empty" />
<resource name="radio_true" type="image" filename="radio_selected" />
<resource name="checkbox_false" type="image" filename="checkbox_empty" retainaspect="1" />
<resource name="checkbox_true" type="image" filename="checkbox_checked" retainaspect="1" />
<resource name="radio_false" type="image" filename="radio_empty" retainaspect="1" />
<resource name="radio_true" type="image" filename="radio_selected" retainaspect="1" />
<resource name="medium_button" type="image" filename="qhd-medium-button" />
<resource name="sort_button" type="image" filename="qhd-sort-button" />
<resource name="minus_button" type="image" filename="qhd-minus-button" />
@@ -43,7 +43,7 @@
<resource name="keyboard2" type="image" filename="keyboard2" />
<resource name="keyboard3" type="image" filename="keyboard3" />
<resource name="keyboard4" type="image" filename="keyboard4" />
<resource name="cursor" type="image" filename="cursor" />
<resource name="cursor" type="image" filename="cursor" retainaspect="1" />
</resources>
<variables>
+5 -5
View File
@@ -25,10 +25,10 @@
<resource name="progress" type="animation" filename="indeterminate" />
<resource name="progress_empty" type="image" filename="progress_empty" />
<resource name="progress_full" type="image" filename="progress_fill" />
<resource name="checkbox_false" type="image" filename="checkbox_empty" />
<resource name="checkbox_true" type="image" filename="checkbox_checked" />
<resource name="radio_false" type="image" filename="radio_empty" />
<resource name="radio_true" type="image" filename="radio_selected" />
<resource name="checkbox_false" type="image" filename="checkbox_empty" retainaspect="1" />
<resource name="checkbox_true" type="image" filename="checkbox_checked" retainaspect="1" />
<resource name="radio_false" type="image" filename="radio_empty" retainaspect="1" />
<resource name="radio_true" type="image" filename="radio_selected" retainaspect="1" />
<resource name="medium_button" type="image" filename="medium-button" />
<resource name="sort_button" type="image" filename="sort-button" />
<resource name="minus_button" type="image" filename="minus-button" />
@@ -43,7 +43,7 @@
<resource name="keyboard2" type="image" filename="keyboard2" />
<resource name="keyboard3" type="image" filename="keyboard3" />
<resource name="keyboard4" type="image" filename="keyboard4" />
<resource name="cursor" type="image" filename="cursor" />
<resource name="cursor" type="image" filename="cursor" retainaspect="1" />
</resources>
<variables>
+5 -5
View File
@@ -25,10 +25,10 @@
<resource name="progress" type="animation" filename="indeterminate" />
<resource name="progress_empty" type="image" filename="progress_empty" />
<resource name="progress_full" type="image" filename="progress_fill" />
<resource name="checkbox_false" type="image" filename="checkbox_empty" />
<resource name="checkbox_true" type="image" filename="checkbox_checked" />
<resource name="radio_false" type="image" filename="radio_empty" />
<resource name="radio_true" type="image" filename="radio_selected" />
<resource name="checkbox_false" type="image" filename="checkbox_empty" retainaspect="1" />
<resource name="checkbox_true" type="image" filename="checkbox_checked" retainaspect="1" />
<resource name="radio_false" type="image" filename="radio_empty" retainaspect="1" />
<resource name="radio_true" type="image" filename="radio_selected" retainaspect="1" />
<resource name="medium_button" type="image" filename="medium-button" />
<resource name="sort_button" type="image" filename="sort-button" />
<resource name="minus_button" type="image" filename="minus-button" />
@@ -43,7 +43,7 @@
<resource name="keyboard2" type="image" filename="keyboard2" />
<resource name="keyboard3" type="image" filename="keyboard3" />
<resource name="keyboard4" type="image" filename="keyboard4" />
<resource name="cursor" type="image" filename="cursor" />
<resource name="cursor" type="image" filename="cursor" retainaspect="1" />
</resources>
<variables>
+5 -5
View File
@@ -22,10 +22,10 @@
<resource name="progress" type="animation" filename="indeterminate" />
<resource name="progress_empty" type="image" filename="progress_empty" />
<resource name="progress_full" type="image" filename="progress_fill" />
<resource name="checkbox_false" type="image" filename="checkbox_empty" />
<resource name="checkbox_true" type="image" filename="checkbox_checked" />
<resource name="radio_false" type="image" filename="radio_empty" />
<resource name="radio_true" type="image" filename="radio_selected" />
<resource name="checkbox_false" type="image" filename="checkbox_empty" retainaspect="1" />
<resource name="checkbox_true" type="image" filename="checkbox_checked" retainaspect="1" />
<resource name="radio_false" type="image" filename="radio_empty" retainaspect="1" />
<resource name="radio_true" type="image" filename="radio_selected" retainaspect="1" />
<resource name="medium_button" type="image" filename="medium-button" />
<resource name="mediumwide_button" type="image" filename="mediumwide-button" />
<resource name="sort_button" type="image" filename="sort-button" />
@@ -42,7 +42,7 @@
<resource name="keyboard2" type="image" filename="keyboard2" />
<resource name="keyboard3" type="image" filename="keyboard3" />
<resource name="keyboard4" type="image" filename="keyboard4" />
<resource name="cursor" type="image" filename="cursor" />
<resource name="cursor" type="image" filename="cursor" retainaspect="1" />
</resources>
<variables>
+61 -3
View File
@@ -75,6 +75,8 @@ static TWAtomicInt gForceRender;
const int gNoAnimation = 1;
blanktimer blankTimer;
int ors_read_fd = -1;
static float scale_theme_w = 1;
static float scale_theme_h = 1;
// Needed by pages.cpp too
int gGuiRunning = 0;
@@ -767,13 +769,26 @@ extern "C" int gui_init(void)
{
gr_init();
std::string curtain_path = TWRES "images/curtain.jpg";
gr_surface source_Surface = NULL;
if (res_create_surface(curtain_path.c_str(), &gCurtain))
if (res_create_surface(curtain_path.c_str(), &source_Surface))
{
printf
("Unable to locate '%s'\nDid you set a DEVICE_RESOLUTION in your config files?\n", curtain_path.c_str());
printf("Unable to locate '%s'\nDid you set a DEVICE_RESOLUTION in your config files?\n", curtain_path.c_str());
return -1;
}
if (gr_get_width(source_Surface) != gr_fb_width() || gr_get_height(source_Surface) != gr_fb_height()) {
// We need to scale the curtain to fit the screen
float scale_w = (float)gr_fb_width() / (float)gr_get_width(source_Surface);
float scale_h = (float)gr_fb_height() / (float)gr_get_height(source_Surface);
if (res_scale_surface(source_Surface, &gCurtain, scale_w, scale_h)) {
LOGINFO("Failed to scale curtain\n");
gCurtain = source_Surface;
} else {
LOGINFO("Scaling the curtain width %fx and height %fx\n", scale_w, scale_h);
}
} else {
gCurtain = source_Surface;
}
curtainSet();
@@ -965,3 +980,46 @@ extern "C" int gui_console_only(void)
return 0;
}
extern "C" void set_scale_values(float w, float h)
{
scale_theme_w = w;
scale_theme_h = h;
}
extern "C" int scale_theme_x(int initial_x)
{
if (scale_theme_w != 1) {
return (int) ((float)initial_x * scale_theme_w);
}
return initial_x;
}
extern "C" int scale_theme_y(int initial_y)
{
if (scale_theme_h != 1) {
return (int) ((float)initial_y * scale_theme_h);
}
return initial_y;
}
extern "C" int scale_theme_min(int initial_value)
{
if (scale_theme_w != 1 || scale_theme_h != 1) {
if (scale_theme_w < scale_theme_h)
return scale_theme_x(initial_value);
else
return scale_theme_y(initial_value);
}
return initial_value;
}
extern "C" float get_scale_w()
{
return scale_theme_w;
}
extern "C" float get_scale_h()
{
return scale_theme_h;
}
+8
View File
@@ -31,5 +31,13 @@ void gui_print(const char *fmt, ...);
void gui_print_color(const char *color, const char *fmt, ...);
void gui_set_FILE(FILE* f);
void set_scale_values(float w, float h);
int scale_theme_x(int initial_x);
int scale_theme_y(int initial_y);
int scale_theme_min(int initial_value);
float get_scale_w();
float get_scale_h();
float get_scale_h();
#endif // _GUI_HEADER
+1 -1
View File
@@ -127,7 +127,7 @@ GUIInput::GUIInput(xml_node<>* node)
if (attr)
{
std::string cwidth = gui_parse_text(attr->value());
CursorWidth = atoi(cwidth.c_str());
CursorWidth = scale_theme_x(atoi(cwidth.c_str()));
}
}
DrawCursor = HasInputFocus;
+4 -3
View File
@@ -37,6 +37,7 @@
extern "C" {
#include "../twcommon.h"
#include "../minuitwrp/minui.h"
#include "gui.h"
}
#include "rapidxml.hpp"
@@ -131,12 +132,12 @@ GUIKeyboard::GUIKeyboard(xml_node<>* node)
if (child) {
attr = child->first_attribute("height");
if (attr)
keyHeight = atoi(attr->value());
keyHeight = scale_theme_y(atoi(attr->value()));
else
keyHeight = 0;
attr = child->first_attribute("width");
if (attr)
keyWidth = atoi(attr->value());
keyWidth = scale_theme_x(atoi(attr->value()));
else
keyWidth = 0;
attr = child->first_attribute("capslock");
@@ -234,7 +235,7 @@ int GUIKeyboard::ParseKey(const char* keyinfo, keyboard_key_class& key, int& Xin
keychar = keyinfo[0];
} else {
// This key has extra data: {keywidth}:{what_the_key_does}
keyWidth = atoi(keyinfo);
keyWidth = scale_theme_x(atoi(keyinfo));
const char* ptr = keyinfo;
while (*ptr > 32 && *ptr != ':')
+56
View File
@@ -41,6 +41,7 @@ extern "C" {
#include "../minuitwrp/minui.h"
#include "../minzip/SysUtil.h"
#include "../minzip/Zip.h"
#include "gui.h"
}
#include "rapidxml.hpp"
@@ -113,6 +114,7 @@ bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w /* = NULL */, int* h
value = node->first_attribute("x")->value();
DataManager::GetValue(value, value);
*x = atol(value.c_str());
*x = scale_theme_x(*x);
*x += tw_x_offset;
}
@@ -121,6 +123,7 @@ bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w /* = NULL */, int* h
value = node->first_attribute("y")->value();
DataManager::GetValue(value, value);
*y = atol(value.c_str());
*y = scale_theme_y(*y);
*y += tw_y_offset;
}
@@ -129,6 +132,7 @@ bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w /* = NULL */, int* h
value = node->first_attribute("w")->value();
DataManager::GetValue(value, value);
*w = atol(value.c_str());
*w = scale_theme_x(*w);
}
if (h && node->first_attribute("h"))
@@ -136,6 +140,7 @@ bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w /* = NULL */, int* h
value = node->first_attribute("h")->value();
DataManager::GetValue(value, value);
*h = atol(value.c_str());
*h = scale_theme_y(*h);
}
if (placement && node->first_attribute("placement"))
@@ -581,7 +586,58 @@ int PageSet::Load(ZipArchive* package)
if (!parent)
parent = mDoc.first_node("install");
set_scale_values(1, 1); // Reset any previous scaling values
// Now, let's parse the XML
LOGINFO("Checking resolution...\n");
child = parent->first_node("details");
if (child) {
xml_node<>* resolution = child->first_node("resolution");
if (resolution) {
xml_attribute<>* width_attr = resolution->first_attribute("width");
xml_attribute<>* height_attr = resolution->first_attribute("height");
xml_attribute<>* noscale_attr = resolution->first_attribute("noscaling");
if (width_attr && height_attr && !noscale_attr) {
int width = atoi(width_attr->value());
int height = atoi(height_attr->value());
int offx = 0, offy = 0;
#ifdef TW_ROUND_SCREEN
xml_node<>* roundscreen = child->first_node("roundscreen");
if (roundscreen) {
LOGINFO("TW_ROUND_SCREEN := true, using round screen XML settings.\n");
xml_attribute<>* offx_attr = roundscreen->first_attribute("offset_x");
xml_attribute<>* offy_attr = roundscreen->first_attribute("offset_y");
if (offx_attr) {
offx = atoi(offx_attr->value());
}
if (offy_attr) {
offy = atoi(offy_attr->value());
}
}
#endif
if (width != 0 && height != 0) {
float scale_w = ((float)gr_fb_width() - ((float)offx * 2.0)) / (float)width;
float scale_h = ((float)gr_fb_height() - ((float)offy * 2.0)) / (float)height;
#ifdef TW_ROUND_SCREEN
float scale_off_w = (float)gr_fb_width() / (float)width;
float scale_off_h = (float)gr_fb_height() / (float)height;
tw_x_offset = offx * scale_off_w;
tw_y_offset = offy * scale_off_h;
#endif
if (scale_w != 1 || scale_h != 1) {
LOGINFO("Scaling theme width %fx and height %fx, offsets x: %i y: %i\n", scale_w, scale_h, tw_x_offset, tw_y_offset);
set_scale_values(scale_w, scale_h);
}
}
} else {
LOGINFO("XML does not contain width and height, no scaling will be applied\n");
}
} else {
LOGINFO("XML contains no resolution tag, no scaling will be applied.\n");
}
} else {
LOGINFO("XML contains no details tag, no scaling will be applied.\n");
}
LOGINFO("Loading resources...\n");
child = parent->first_node("resources");
if (child)
+76 -37
View File
@@ -23,6 +23,7 @@
extern "C" {
#include "../twcommon.h"
#include "../minuitwrp/minui.h"
#include "gui.h"
}
#include "rapidxml.hpp"
@@ -61,6 +62,49 @@ int Resource::ExtractResource(ZipArchive* pZip, std::string folderName, std::str
return ret;
}
void Resource::LoadImage(ZipArchive* pZip, std::string file, gr_surface* source)
{
if (ExtractResource(pZip, "images", file, ".png", TMP_RESOURCE_NAME) == 0)
{
res_create_surface(TMP_RESOURCE_NAME, source);
unlink(TMP_RESOURCE_NAME);
}
else if (ExtractResource(pZip, "images", file, "", TMP_RESOURCE_NAME) == 0)
{
// JPG includes the .jpg extension in the filename so extension should be blank
res_create_surface(TMP_RESOURCE_NAME, source);
unlink(TMP_RESOURCE_NAME);
}
else if (!pZip)
{
// File name in xml may have included .png so try without adding .png
res_create_surface(file.c_str(), source);
}
}
void Resource::CheckAndScaleImage(gr_surface source, gr_surface* destination, int retain_aspect)
{
if (!source) {
*destination = NULL;
return;
}
if (get_scale_w() != 0 && get_scale_h() != 0) {
float scale_w = get_scale_w(), scale_h = get_scale_h();
if (retain_aspect) {
if (scale_w < scale_h)
scale_h = scale_w;
else
scale_w = scale_h;
}
if (res_scale_surface(source, destination, scale_w, scale_h)) {
LOGINFO("Error scaling image, using regular size.\n");
*destination = source;
}
} else {
*destination = source;
}
}
FontResource::FontResource(xml_node<>* node, ZipArchive* pZip)
: Resource(node, pZip)
{
@@ -86,7 +130,7 @@ FontResource::FontResource(xml_node<>* node, ZipArchive* pZip)
if(!attr)
return;
int size = atoi(attr->value());
int size = scale_theme_min(atoi(attr->value()));
int dpi = 300;
attr = node->first_attribute("dpi");
@@ -143,10 +187,11 @@ FontResource::~FontResource()
}
}
ImageResource::ImageResource(xml_node<>* node, ZipArchive* pZip)
ImageResource::ImageResource(xml_node<>* node, ZipArchive* pZip, int retain_aspect)
: Resource(node, pZip)
{
std::string file;
gr_surface temp_surface = NULL;
mSurface = NULL;
if (!node) {
@@ -156,20 +201,13 @@ ImageResource::ImageResource(xml_node<>* node, ZipArchive* pZip)
if (node->first_attribute("filename"))
file = node->first_attribute("filename")->value();
else {
LOGERR("No filename specified for image resource.\n");
return;
}
if (ExtractResource(pZip, "images", file, ".png", TMP_RESOURCE_NAME) == 0)
{
res_create_surface(TMP_RESOURCE_NAME, &mSurface);
unlink(TMP_RESOURCE_NAME);
}
else if (ExtractResource(pZip, "images", file, "", TMP_RESOURCE_NAME) == 0)
{
// JPG includes the .jpg extension in the filename so extension should be blank
res_create_surface(TMP_RESOURCE_NAME, &mSurface);
unlink(TMP_RESOURCE_NAME);
}
else
res_create_surface(file.c_str(), &mSurface);
LoadImage(pZip, file, &temp_surface);
CheckAndScaleImage(temp_surface, &mSurface, retain_aspect);
}
ImageResource::~ImageResource()
@@ -178,7 +216,7 @@ ImageResource::~ImageResource()
res_free_surface(mSurface);
}
AnimationResource::AnimationResource(xml_node<>* node, ZipArchive* pZip)
AnimationResource::AnimationResource(xml_node<>* node, ZipArchive* pZip, int retain_aspect)
: Resource(node, pZip)
{
std::string file;
@@ -189,30 +227,24 @@ AnimationResource::AnimationResource(xml_node<>* node, ZipArchive* pZip)
if (node->first_attribute("filename"))
file = node->first_attribute("filename")->value();
else {
LOGERR("No filename specified for image resource.\n");
return;
}
for (;;)
{
std::ostringstream fileName;
fileName << file << std::setfill ('0') << std::setw (3) << fileNum;
gr_surface surface;
if (pZip)
{
if (ExtractResource(pZip, "images", fileName.str(), ".png", TMP_RESOURCE_NAME) != 0)
break;
if (res_create_surface(TMP_RESOURCE_NAME, &surface))
break;
unlink(TMP_RESOURCE_NAME);
}
else
{
if (res_create_surface(fileName.str().c_str(), &surface))
break;
}
mSurfaces.push_back(surface);
fileNum++;
gr_surface surface, temp_surface = NULL;
LoadImage(pZip, fileName.str(), &temp_surface);
CheckAndScaleImage(temp_surface, &surface, retain_aspect);
if (surface) {
mSurfaces.push_back(surface);
fileNum++;
} else
break; // Done loading animation images
}
}
@@ -264,17 +296,24 @@ void ResourceManager::LoadResources(xml_node<>* resList, ZipArchive* pZip)
}
else if (type == "image")
{
res = new ImageResource(child, pZip);
int retain = 0;
xml_attribute<>* retain_aspect_ratio = child->first_attribute("retainaspect");
if (retain_aspect_ratio)
retain = 1; // the value does not matter, if retainaspect is present, we assume that we want to retain it
res = new ImageResource(child, pZip, retain);
}
else if (type == "animation")
{
res = new AnimationResource(child, pZip);
int retain = 0;
xml_attribute<>* retain_aspect_ratio = child->first_attribute("retainaspect");
if (retain_aspect_ratio)
retain = 1; // the value does not matter, if retainaspect is present, we assume that we want to retain it
res = new AnimationResource(child, pZip, retain);
}
else
{
LOGERR("Resource type (%s) not supported.\n", type.c_str());
}
if (res == NULL || res->GetResource() == NULL)
{
std::string res_name;
+4 -2
View File
@@ -25,6 +25,8 @@ private:
protected:
static int ExtractResource(ZipArchive* pZip, std::string folderName, std::string fileName, std::string fileExtn, std::string destFile);
static void LoadImage(ZipArchive* pZip, std::string file, gr_surface* source);
static void CheckAndScaleImage(gr_surface source, gr_surface* destination, int retain_aspect);
};
class FontResource : public Resource
@@ -52,7 +54,7 @@ protected:
class ImageResource : public Resource
{
public:
ImageResource(xml_node<>* node, ZipArchive* pZip);
ImageResource(xml_node<>* node, ZipArchive* pZip, int retain_aspect);
virtual ~ImageResource();
public:
@@ -65,7 +67,7 @@ protected:
class AnimationResource : public Resource
{
public:
AnimationResource(xml_node<>* node, ZipArchive* pZip);
AnimationResource(xml_node<>* node, ZipArchive* pZip, int retain_aspect);
virtual ~AnimationResource();
public:
+7 -7
View File
@@ -91,7 +91,7 @@ GUIScrollList::GUIScrollList(xml_node<>* node) : GUIObject(node)
attr = child->first_attribute("separatorheight");
if (attr) {
string parsevalue = gui_parse_text(attr->value());
mHeaderSeparatorH = atoi(parsevalue.c_str());
mHeaderSeparatorH = scale_theme_y(atoi(parsevalue.c_str()));
header_separator_height_specified = -1;
}
}
@@ -156,7 +156,7 @@ GUIScrollList::GUIScrollList(xml_node<>* node) : GUIObject(node)
attr = child->first_attribute("spacing");
if (attr) {
string parsevalue = gui_parse_text(attr->value());
mItemSpacing = atoi(parsevalue.c_str());
mItemSpacing = scale_theme_y(atoi(parsevalue.c_str()));
}
attr = child->first_attribute("highlightcolor");
@@ -185,7 +185,7 @@ GUIScrollList::GUIScrollList(xml_node<>* node) : GUIObject(node)
attr = child->first_attribute("height");
if (attr) {
string parsevalue = gui_parse_text(attr->value());
mSeparatorH = atoi(parsevalue.c_str());
mSeparatorH = scale_theme_y(atoi(parsevalue.c_str()));
if (!header_separator_height_specified)
mHeaderSeparatorH = mSeparatorH;
}
@@ -206,25 +206,25 @@ GUIScrollList::GUIScrollList(xml_node<>* node) : GUIObject(node)
attr = child->first_attribute("w");
if (attr) {
string parsevalue = gui_parse_text(attr->value());
mFastScrollW = atoi(parsevalue.c_str());
mFastScrollW = scale_theme_x(atoi(parsevalue.c_str()));
}
attr = child->first_attribute("linew");
if (attr) {
string parsevalue = gui_parse_text(attr->value());
mFastScrollLineW = atoi(parsevalue.c_str());
mFastScrollLineW = scale_theme_x(atoi(parsevalue.c_str()));
}
attr = child->first_attribute("rectw");
if (attr) {
string parsevalue = gui_parse_text(attr->value());
mFastScrollRectW = atoi(parsevalue.c_str());
mFastScrollRectW = scale_theme_x(atoi(parsevalue.c_str()));
}
attr = child->first_attribute("recth");
if (attr) {
string parsevalue = gui_parse_text(attr->value());
mFastScrollRectH = atoi(parsevalue.c_str());
mFastScrollRectH = scale_theme_y(atoi(parsevalue.c_str()));
}
}
+4 -4
View File
@@ -173,14 +173,14 @@ GUISliderValue::GUISliderValue(xml_node<>* node) : GUIObject(node)
if (attr)
{
string parsevalue = gui_parse_text(attr->value());
mLineH = atoi(parsevalue.c_str());
mLineH = scale_theme_y(atoi(parsevalue.c_str()));
}
attr = child->first_attribute("linepadding");
if (attr)
{
string parsevalue = gui_parse_text(attr->value());
mPadding = atoi(parsevalue.c_str());
mPadding = scale_theme_x(atoi(parsevalue.c_str()));
mLinePadding = mPadding;
}
@@ -188,14 +188,14 @@ GUISliderValue::GUISliderValue(xml_node<>* node) : GUIObject(node)
if (attr)
{
string parsevalue = gui_parse_text(attr->value());
mSliderW = atoi(parsevalue.c_str());
mSliderW = scale_theme_x(atoi(parsevalue.c_str()));
}
attr = child->first_attribute("sliderh");
if (attr)
{
string parsevalue = gui_parse_text(attr->value());
mSliderH = atoi(parsevalue.c_str());
mSliderH = scale_theme_y(atoi(parsevalue.c_str()));
}
}
+2
View File
@@ -67,6 +67,7 @@ unsigned int gr_get_height(gr_surface surface);
int gr_get_surface(gr_surface* surface);
int gr_free_surface(gr_surface surface);
// Functions in graphics_utils.c
int gr_save_screenshot(const char *dest);
// input event structure, include <linux/input.h> for the definition.
@@ -83,6 +84,7 @@ int ev_has_mouse(void);
// Returns 0 if no error, else negative.
int res_create_surface(const char* name, gr_surface* pSurface);
void res_free_surface(gr_surface surface);
int res_scale_surface(gr_surface source, gr_surface* destination, float scale_w, float scale_h);
// Needed for AOSP:
int ev_wait(int timeout);
+75 -1
View File
@@ -347,7 +347,7 @@ int res_create_surface(const char* name, gr_surface* pSurface) {
if (!name) return -1;
if (strlen(name) > 4 && strcmp(name + strlen(name) - 4, ".jpg") == 0)
return res_create_surface_jpg(name,pSurface);
return res_create_surface_jpg(name,pSurface);
ret = res_create_surface_png(name,pSurface);
if (ret < 0)
@@ -362,3 +362,77 @@ void res_free_surface(gr_surface surface) {
free(pSurface);
}
}
// Scale image function
int res_scale_surface(gr_surface source, gr_surface* destination, float scale_w, float scale_h) {
GGLContext *sc_context = 0;
gglInit(&sc_context);
GGLContext *gl = sc_context;
GGLSurface* sc_mem_surface = NULL;
*destination = NULL;
GGLSurface *surface = (GGLSurface*)source;
int w = gr_get_width(source), h = gr_get_height(source);
int sx = 0, sy = 0, dx = 0, dy = 0;
float dw = (float)w * scale_w;
float dh = (float)h * scale_h;
// Create a new surface that is the appropriate size
sc_mem_surface = init_display_surface((int)dw, (int)dh);
if (!sc_mem_surface) {
printf("gr_scale_surface failed to init_display_surface\n");
return -1;
}
sc_mem_surface->format = surface->format;
// Finish initializing the context
gl->colorBuffer(gl, sc_mem_surface);
gl->activeTexture(gl, 0);
// Enable or disable blending based on source surface format
if (surface->format == GGL_PIXEL_FORMAT_RGBX_8888) {
gl->disable(gl, GGL_BLEND);
} else {
gl->enable(gl, GGL_BLEND);
gl->blendFunc(gl, GGL_ONE, GGL_ZERO);
}
// Bind our source surface to the context
gl->bindTexture(gl, surface);
// Deal with the scaling
gl->texParameteri(gl, GGL_TEXTURE_2D, GGL_TEXTURE_MIN_FILTER, GGL_LINEAR);
gl->texParameteri(gl, GGL_TEXTURE_2D, GGL_TEXTURE_MAG_FILTER, GGL_LINEAR);
gl->texParameteri(gl, GGL_TEXTURE_2D, GGL_TEXTURE_WRAP_S, GGL_CLAMP);
gl->texParameteri(gl, GGL_TEXTURE_2D, GGL_TEXTURE_WRAP_T, GGL_CLAMP);
gl->texEnvi(gl, GGL_TEXTURE_ENV, GGL_TEXTURE_ENV_MODE, GGL_REPLACE);
gl->texGeni(gl, GGL_S, GGL_TEXTURE_GEN_MODE, GGL_AUTOMATIC);
gl->texGeni(gl, GGL_T, GGL_TEXTURE_GEN_MODE, GGL_AUTOMATIC);
gl->enable(gl, GGL_TEXTURE_2D);
int32_t grad[8];
memset(grad, 0, sizeof(grad));
// s, dsdx, dsdy, scale, t, dtdx, dtdy, tscale <- this is wrong!
// This api uses block floating-point for S and T texture coordinates.
// All values are given in 16.16, scaled by 'scale'. In other words,
// set scale to 0, for 16.16 values.
// s, dsdx, dsdy, t, dtdx, dtdy, sscale, tscale
float dsdx = (float)w / dw;
float dtdy = (float)h / dh;
grad[0] = ((float)sx - (dsdx * dx)) * 65536;
grad[1] = dsdx * 65536;
grad[3] = ((float)sy - (dtdy * dy)) * 65536;
grad[5] = dtdy * 65536;
// printf("blit: w=%d h=%d dx=%d dy=%d dw=%f dh=%f dsdx=%f dtdy=%f s0=%x dsdx=%x t0=%x dtdy=%x\n",
// w, h, dx, dy, dw, dh, dsdx, dtdy, grad[0], grad[1], grad[3], grad[5]);
gl->texCoordGradScale8xv(gl, 0 /*tmu*/, grad);
// draw / scale the source surface to our target context
gl->recti(gl, dx, dy, dx + dw, dy + dh);
// put the scaled surface in our destination
*destination = (gr_surface*) sc_mem_surface;
// free memory used in the source
res_free_surface(source);
source = NULL;
return 0;
}