diff --git a/AndroidBoard.mk b/AndroidBoard.mk index 0c54e4f..ff16eef 100644 --- a/AndroidBoard.mk +++ b/AndroidBoard.mk @@ -23,6 +23,3 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) - -# include the non-open-source counterpart to this file --include vendor/huawei/u8815/AndroidBoardVendor.mk diff --git a/AndroidProducts.mk b/AndroidProducts.mk index 691eeed..9b5188e 100644 --- a/AndroidProducts.mk +++ b/AndroidProducts.mk @@ -15,4 +15,4 @@ # PRODUCT_MAKEFILES := \ - $(LOCAL_DIR)/device_u8815.mk + $(LOCAL_DIR)/device_u8815.mk \ No newline at end of file diff --git a/BoardConfig.mk b/BoardConfig.mk index 9ccbd6e..c4ad0ff 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -14,51 +14,51 @@ # limitations under the License. # -# inherit from the proprietary version --include vendor/huawei/u8815/BoardConfigVendor.mk - -# CPU -TARGET_CPU_ABI := armeabi-v7a -TARGET_CPU_ABI2 := armeabi -TARGER_ARCH := arm -TARGET_ARCH_VARIANT := armv7-a-neon +TARGET_OTA_ASSERT_DEVICE := hwu8815,u8815,hwu8818,u8818 -# Board name +# Platform TARGET_BOOTLOADER_BOARD_NAME := u8815 TARGET_BOARD_PLATFORM := msm7x27a - -# Target arch settings -TARGET_NO_BOOTLOADER := true TARGET_BOARD_PLATFORM_GPU := qcom-adreno200 +TARGET_NO_BOOTLOADER := true +TARGET_NO_RADIOIMAGE := true + +# Architecture +TARGER_ARCH := arm +TARGET_ARCH_VARIANT := armv7-a-neon +TARGET_CPU_ABI := armeabi-v7a +TARGET_CPU_ABI2 := armeabi +TARGET_CPU_SMP := true ARCH_ARM_HAVE_TLS_REGISTER := true TARGET_CORTEX_CACHE_LINE_32 := true -# Recovery image settings -BOARD_KERNEL_CMDLINE := console=ttyMSM1,115200 +# Partitions +BOARD_SYSTEMIMAGE_PARTITION_SIZE := 0x12C00000 +BOARD_USERDATAIMAGE_PARTITION_SIZE := 0x0AF00000 +BOARD_BOOTIMAGE_PARTITION_SIZE := 0x00C00000 +BOARD_RECOVERYIMAGE_PARTITION_SIZE := 0x00C00000 +BOARD_FLASH_BLOCK_SIZE := 0x00020000 +TARGET_USERIMAGES_USE_EXT4 := true + +# Kernel +BOARD_KERNEL_CMDLINE := androidboot.hardware=huawei BOARD_KERNEL_BASE := 0x00200000 -BOARD_PAGE_SIZE := 0x00001000 +BOARD_PAGE_SIZE := 2048 TARGET_PREBUILT_KERNEL := device/huawei/u8815/kernel -# USB mounting -TARGET_USE_CUSTOM_LUN_FILE_PATH := /sys/class/android_usb/android0/f_mass_storage/lun%d/file +# USB Mounting BOARD_UMS_LUNFILE := "/sys/class/android_usb/android0/f_mass_storage/lun%d/file" # Recovery +BOARD_HAS_NO_SELECT_BUTTON := true +TARGET_PREBUILT_RECOVERY_KERNEL := device/huawei/u8815/kernel TARGET_RECOVERY_INITRC := device/huawei/u8815/init.rc -BOARD_BOOTIMAGE_PARTITION_SIZE := 0x00C00000 -BOARD_RECOVERYIMAGE_PARTITION_SIZE := 0x00C00000 -BOARD_SYSTEMIMAGE_PARTITION_SIZE := 0x12C00000 -BOARD_USERDATAIMAGE_PARTITION_SIZE := 0x0AF00000 -BOARD_FLASH_BLOCK_SIZE := 0x00020000 - -BOARD_USES_MMCUTILS := true +BOARD_CUSTOM_GRAPHICS := ../../../device/huawei/u8815/recovery/graphics.c BOARD_HAS_NO_MISC_PARTITION := true -TARGET_USERIMAGES_USE_EXT4 := true +BOARD_USES_MMCUTILS := true TARGET_RECOVERY_PIXEL_FORMAT := "RGBX_8888" -BOARD_CUSTOM_GRAPHICS := ../../../device/huawei/u8815/recovery/graphics.c -BOARD_USE_CUSTOM_RECOVERY_FONT:= \"roboto_10x18.h\" +TW_BOARD_CUSTOM_GRAPHICS := ../../../device/huawei/u8815/recovery/graphics.c DEVICE_RESOLUTION := 480x800 -RECOVERY_GRAPHICS_USE_LINELENGTH := true SP1_NAME := "cust" SP1_BACKUP_METHOD := files SP1_MOUNTABLE := 1 @@ -67,5 +67,6 @@ SP2_BACKUP_METHOD := files SP2_MOUNTABLE := 1 TW_EXTERNAL_STORAGE_PATH := "/sdcard" TW_EXTERNAL_STORAGE_MOUNT_POINT := "sdcard" - -TARGET_OTA_ASSERT_DEVICE := hwu8815,u8815,hwu8818,u8818 +TARGET_USE_CUSTOM_LUN_FILE_PATH := /sys/class/android_usb/android0/f_mass_storage/lun%d/file +BOARD_USE_CUSTOM_RECOVERY_FONT:= \"roboto_10x18.h\" +RECOVERY_GRAPHICS_USE_LINELENGTH := true diff --git a/cm.mk b/cm.mk index 3b90dc2..b2571e8 100644 --- a/cm.mk +++ b/cm.mk @@ -1,22 +1,15 @@ -## Specify phone tech before including full_phone +# Inherit CM common GSM stuff. $(call inherit-product, vendor/cm/config/gsm.mk) -# Inherit some common CM stuff. +# Inherit CM common Phone stuff. $(call inherit-product, vendor/cm/config/common_full_phone.mk) -# Inherit device configuration +# Inherit device configuration. $(call inherit-product, device/huawei/u8815/device_u8815.mk) -# -# Setup device specific product configuration. -# -PRODUCT_BUILD_PROP_OVERRIDES += BUILD_UTC_DATE=0 +# Device identifier. +PRODUCT_DEVICE := u8815 PRODUCT_NAME := cm_u8815 PRODUCT_BRAND := huawei -PRODUCT_DEVICE := u8815 PRODUCT_MODEL := Ascend G300 PRODUCT_MANUFACTURER := huawei - -# Release name and versioning -PRODUCT_RELEASE_NAME := U8815 - diff --git a/device_u8815.mk b/device_u8815.mk index 4778aeb..105932c 100644 --- a/device_u8815.mk +++ b/device_u8815.mk @@ -13,6 +13,7 @@ # limitations under the License. # Inherit common language setup +$(call inherit-product, build/target/product/full_base_telephony.mk) $(call inherit-product, $(SRC_TARGET_DIR)/product/languages_full.mk) # Inherit u8815 vendor setup @@ -29,9 +30,3 @@ PRODUCT_COPY_FILES += \ device/huawei/u8815/recovery/sbin/libhwrpc.so:/recovery/root/sbin/libhwrpc.so \ device/huawei/u8815/recovery/sbin/liboeminfo.so:/recovery/root/sbin/liboeminfo.so \ device/huawei/u8815/recovery/sbin/charge.sh:/recovery/root/sbin/charge.sh - -# Device Naming -PRODUCT_NAME := full_u8815 -PRODUCT_DEVICE := u8815 -PRODUCT_BRAND := huawei -PRODUCT_MODEL := Huawei Ascend G300 diff --git a/init.rc b/init.rc index 3aa0d7b..c7cca44 100644 --- a/init.rc +++ b/init.rc @@ -1,76 +1,73 @@ -on early-init - start ueventd - -on init - export PATH /sbin - export LD_LIBRARY_PATH .:/sbin:/system/lib - export ANDROID_ROOT /system - export ANDROID_DATA /data - export EXTERNAL_STORAGE /sdcard - - symlink /system/etc /etc - - mkdir /boot - mkdir /sdcard - mkdir /sd-ext - mkdir /datadata - mkdir /cust - mkdir /emmc - mkdir /system - mkdir /data - mkdir /cache - mkdir /internal_sd - mount /tmp /tmp tmpfs - -# Always start adbd on userdebug and eng builds - write /sys/class/android_usb/android0/enable 0 - write /sys/class/android_usb/android0/idVendor 12d1 - write /sys/class/android_usb/android0/idProduct 1038 - write /sys/class/android_usb/android0/f_mass_storage/cdrom_index none - write /sys/class/android_usb/android0/f_mass_storage/nluns 2 - write /sys/class/android_usb/android0/functions mass_storage,adb - -on boot - ifup lo - hostname localhost - domainname localdomain - - class_start default - -service ueventd /sbin/ueventd - critical - -service recovery /sbin/recovery - -service adbd /sbin/adbd recovery - disabled - -service rmt_storage /sbin/rmt_storage - class main - user root - disabled - -service rmt_oeminfo /sbin/rmt_oeminfo - class main - user root - oneshot - -on property:ro.boot.emmc=true - start rmt_oeminfo - start rmt_storage - -service recovery /sbin/sh /sbin/charge.sh - oneshot - -service charge /sbin/charge - oneshot - -#start adbd -on property:ro.debuggable=1 - setprop service.adb.root 1 - -# Restart adbd so it can run as root -on property:service.adb.root=1 - write /sys/class/android_usb/android0/enable 0 - restart adbd - write /sys/class/android_usb/android0/enable 1 +on early-init + start ueventd + +on init + export PATH /sbin + export LD_LIBRARY_PATH .:/sbin + export ANDROID_ROOT /system + export ANDROID_DATA /data + export EXTERNAL_STORAGE /sdcard + + symlink /system/etc /etc + + mkdir /boot + mkdir /sdcard + mkdir /sd-ext + mkdir /cust + mkdir /datadata + mkdir /emmc + mkdir /internal_sd + mkdir /system + mkdir /data + mkdir /cache + mount /tmp /tmp tmpfs + + chown root shell /tmp + chmod 0775 /tmp + +# Always start adbd on userdebug and eng builds + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 12d1 + write /sys/class/android_usb/android0/idProduct 1038 + write /sys/class/android_usb/android0/functions mass_storage,adb + write /sys/class/android_usb/android0/f_mass_storage/cdrom_index none + write /sys/class/android_usb/android0/f_mass_storage/nluns 2 + +on boot + ifup lo + hostname localhost + domainname localdomain + + class_start default + +service ueventd /sbin/ueventd + critical + +service adbd /sbin/adbd recovery + disabled + +service recovery /sbin/recovery + +service recovery /sbin/sh /sbin/charge.sh + oneshot + +service charge /sbin/charge + oneshot + +service rmt_storage /sbin/rmt_storage + + +service rmt_oeminfo /sbin/rmt_oeminfo + oneshot + +#start adbd +on property:ro.debuggable=1 + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop service.adb.root 1 + +# Restart adbd so it can run as root +on property:service.adb.root=1 + write /sys/class/android_usb/android0/enable 0 + restart adbd + write /sys/class/android_usb/android0/enable 1 diff --git a/kernel b/kernel index 1c68504..430bda9 100644 Binary files a/kernel and b/kernel differ diff --git a/recovery.fstab b/recovery.fstab index b34bc40..1eb50b8 100644 --- a/recovery.fstab +++ b/recovery.fstab @@ -1,12 +1,12 @@ -# mount point fstype device +# mount point fstype device -/boot emmc /dev/block/mmcblk0p15 -/cache ext4 /dev/block/mmcblk0p6 -/data ext4 /dev/block/mmcblk0p13 -/system ext4 /dev/block/mmcblk0p12 -/internal_sd vfat /dev/block/mmcblk0p19 -/sdcard vfat /dev/block/mmcblk1p1 /dev/block/mmcblk1 -/misc emmc /dev/block/mmcblk0p7 -/recovery emmc /dev/block/mmcblk0p16 -/cust ext4 /dev/block/mmcblk0p18 -/sd-ext ext4 /dev/block/mmcblk1p2 +/cache ext4 /dev/block/mmcblk0p6 +/misc emmc /dev/block/mmcblk0p7 +/system ext4 /dev/block/mmcblk0p12 +/data ext4 /dev/block/mmcblk0p13 +/boot emmc /dev/block/mmcblk0p15 +/recovery emmc /dev/block/mmcblk0p16 +/cust ext4 /dev/block/mmcblk0p18 +/internal_sd vfat /dev/block/mmcblk0p19 +/sdcard vfat /dev/block/mmcblk1p1 /dev/block/mmcblk1 +/sd-ext ext4 /dev/block/mmcblk1p2 diff --git a/recovery/graphics.c b/recovery/graphics.c index 12ec36d..de58e44 100644 --- a/recovery/graphics.c +++ b/recovery/graphics.c @@ -30,28 +30,34 @@ #include +#include "minui.h" + #ifdef BOARD_USE_CUSTOM_RECOVERY_FONT #include BOARD_USE_CUSTOM_RECOVERY_FONT #else #include "font_10x18.h" #endif -#include "minui.h" - -#if defined(RECOVERY_BGRA) +#ifdef RECOVERY_BGRA #define PIXEL_FORMAT GGL_PIXEL_FORMAT_BGRA_8888 -#define PIXEL_SIZE 4 -#elif defined(RECOVERY_RGBX) +#define PIXEL_SIZE 4 +#endif +#ifdef RECOVERY_RGBX #define PIXEL_FORMAT GGL_PIXEL_FORMAT_RGBX_8888 -#define PIXEL_SIZE 4 -#else +#define PIXEL_SIZE 4 +#endif +#ifndef PIXEL_FORMAT #define PIXEL_FORMAT GGL_PIXEL_FORMAT_RGB_565 -#define PIXEL_SIZE 2 +#define PIXEL_SIZE 2 #endif +#define NUM_BUFFERS 2 + +// #define PRINT_SCREENINFO 1 // Enables printing of screen info to log + typedef struct { GGLSurface texture; - unsigned cwidth; + unsigned offset[97]; unsigned cheight; unsigned ascent; } GRFont; @@ -59,9 +65,10 @@ typedef struct { static GRFont *gr_font = 0; static GGLContext *gr_context = 0; static GGLSurface gr_font_texture; -static GGLSurface gr_framebuffer[2]; +static GGLSurface gr_framebuffer[NUM_BUFFERS]; static GGLSurface gr_mem_surface; static unsigned gr_active_fb = 0; +static unsigned double_buffering = 0; static int gr_fb_fd = -1; static int gr_vt_fd = -1; @@ -69,6 +76,20 @@ static int gr_vt_fd = -1; static struct fb_var_screeninfo vi; static struct fb_fix_screeninfo fi; +#ifdef PRINT_SCREENINFO +static void print_fb_var_screeninfo() +{ + LOGI("vi.xres: %d\n", vi.xres); + LOGI("vi.yres: %d\n", vi.yres); + LOGI("vi.xres_virtual: %d\n", vi.xres_virtual); + LOGI("vi.yres_virtual: %d\n", vi.yres_virtual); + LOGI("vi.xoffset: %d\n", vi.xoffset); + LOGI("vi.yoffset: %d\n", vi.yoffset); + LOGI("vi.bits_per_pixel: %d\n", vi.bits_per_pixel); + LOGI("vi.grayscale: %d\n", vi.grayscale); +} +#endif + static int get_framebuffer(GGLSurface *fb) { int fd; @@ -86,35 +107,65 @@ static int get_framebuffer(GGLSurface *fb) return -1; } + fprintf(stderr, "Pixel format: %dx%d @ %dbpp\n", vi.xres, vi.yres, vi.bits_per_pixel); + vi.bits_per_pixel = PIXEL_SIZE * 8; if (PIXEL_FORMAT == GGL_PIXEL_FORMAT_BGRA_8888) { - vi.red.offset = 8; - vi.red.length = 8; - vi.green.offset = 16; - vi.green.length = 8; - vi.blue.offset = 24; - vi.blue.length = 8; - vi.transp.offset = 0; - vi.transp.length = 8; + fprintf(stderr, "Pixel format: BGRA_8888\n"); + if (PIXEL_SIZE != 4) fprintf(stderr, "E: Pixel Size mismatch!\n"); + vi.red.offset = 8; + vi.red.length = 8; + vi.green.offset = 16; + vi.green.length = 8; + vi.blue.offset = 24; + vi.blue.length = 8; + vi.transp.offset = 0; + vi.transp.length = 8; } else if (PIXEL_FORMAT == GGL_PIXEL_FORMAT_RGBX_8888) { - vi.red.offset = 24; - vi.red.length = 8; - vi.green.offset = 16; - vi.green.length = 8; - vi.blue.offset = 8; - vi.blue.length = 8; - vi.transp.offset = 0; - vi.transp.length = 8; - } else { /* RGB565*/ - vi.red.offset = 11; - vi.red.length = 5; - vi.green.offset = 5; - vi.green.length = 6; - vi.blue.offset = 0; - vi.blue.length = 5; - vi.transp.offset = 0; - vi.transp.length = 0; + fprintf(stderr, "Pixel format: RGBX_8888\n"); + if (PIXEL_SIZE != 4) fprintf(stderr, "E: Pixel Size mismatch!\n"); + vi.red.offset = 24; + vi.red.length = 8; + vi.green.offset = 16; + vi.green.length = 8; + vi.blue.offset = 8; + vi.blue.length = 8; + vi.transp.offset = 0; + vi.transp.length = 8; +// TODO is this backwards RGB and BGR? + } else if (PIXEL_FORMAT == GGL_PIXEL_FORMAT_RGB_565) { +#ifndef RECOVERY_RGB_565 + fprintf(stderr, "Pixel format: RGB_565\n"); + vi.blue.offset = 0; + vi.green.offset = 5; + vi.red.offset = 11; +#else + fprintf(stderr, "Pixel format: BGR_565\n"); + vi.blue.offset = 11; + vi.green.offset = 5; + vi.red.offset = 0; +#endif + if (PIXEL_SIZE != 2) + fprintf(stderr, "E: Pixel Size mismatch!\n"); + vi.blue.length = 5; + vi.green.length = 6; + vi.red.length = 5; + vi.blue.msb_right = 0; + vi.green.msb_right = 0; + vi.red.msb_right = 0; + vi.transp.offset = 0; + vi.transp.length = 0; } + else + { + perror("unknown pixel format"); + close(fd); + return -1; + } + + vi.vmode = FB_VMODE_NONINTERLACED; + vi.activate = FB_ACTIVATE_NOW | FB_ACTIVATE_FORCE; + if (ioctl(fd, FBIOPUT_VSCREENINFO, &vi) < 0) { perror("failed to put fb0 info"); close(fd); @@ -134,23 +185,47 @@ static int get_framebuffer(GGLSurface *fb) return -1; } +#ifdef RECOVERY_GRAPHICS_USE_LINELENGTH + vi.xres_virtual = fi.line_length / PIXEL_SIZE; +#endif + fb->version = sizeof(*fb); fb->width = vi.xres; fb->height = vi.yres; - fb->stride = fi.line_length/PIXEL_SIZE; +#ifdef BOARD_HAS_JANKY_BACKBUFFER + LOGI("setting JANKY BACKBUFFER\n"); + fb->stride = fi.line_length/2; +#else + fb->stride = vi.xres_virtual; +#endif fb->data = bits; fb->format = PIXEL_FORMAT; - memset(fb->data, 0, vi.yres * fi.line_length); + memset(fb->data, 0, vi.yres * fb->stride * PIXEL_SIZE); fb++; + /* check if we can use double buffering */ + if (vi.yres * fi.line_length * 2 > fi.smem_len) + return fd; + + double_buffering = 1; + fb->version = sizeof(*fb); fb->width = vi.xres; fb->height = vi.yres; - fb->stride = fi.line_length/PIXEL_SIZE; +#ifdef BOARD_HAS_JANKY_BACKBUFFER + fb->stride = fi.line_length/2; fb->data = (void*) (((unsigned) bits) + vi.yres * fi.line_length); +#else + fb->stride = vi.xres_virtual; + fb->data = (void*) (((unsigned) bits) + vi.yres * fb->stride * PIXEL_SIZE); +#endif fb->format = PIXEL_FORMAT; - memset(fb->data, 0, vi.yres * fi.line_length); + memset(fb->data, 0, vi.yres * fb->stride * PIXEL_SIZE); + +#ifdef PRINT_SCREENINFO + print_fb_var_screeninfo(); +#endif return fd; } @@ -159,56 +234,44 @@ static void get_memory_surface(GGLSurface* ms) { ms->version = sizeof(*ms); ms->width = vi.xres; ms->height = vi.yres; - ms->stride = fi.line_length/PIXEL_SIZE; - ms->data = malloc(fi.line_length * vi.yres); + ms->stride = vi.xres_virtual; + ms->data = malloc(vi.xres_virtual * vi.yres * PIXEL_SIZE); ms->format = PIXEL_FORMAT; } static void set_active_framebuffer(unsigned n) { - if (n > 1) return; - vi.yres_virtual = vi.yres * PIXEL_SIZE; + if (n > 1 || !double_buffering) return; + vi.yres_virtual = vi.yres * NUM_BUFFERS; vi.yoffset = n * vi.yres; - vi.bits_per_pixel = PIXEL_SIZE * 8; +// vi.bits_per_pixel = PIXEL_SIZE * 8; if (ioctl(gr_fb_fd, FBIOPUT_VSCREENINFO, &vi) < 0) { perror("active fb swap failed"); } } -void gr_flip_32(unsigned *bits, unsigned *ptr, unsigned count) -{ - unsigned i=0; - while (i> 11) & 0x1F); - red = (rgb32 << 3) | (rgb32 >> 2); - rgb32 = ((ptr[i] >> 5) & 0x3F); - green = (rgb32 << 2) | (rgb32 >> 4); - rgb32 = ((ptr[i]) & 0x1F); - blue = (rgb32 << 3) | (rgb32 >> 2); - alpha = 0xff; - rgb32 = (alpha << 24) | (blue << 16) - | (green << 8) | (red); - *bits=rgb32; - i++; - bits++; - } -} - void gr_flip(void) { GGLContext *gl = gr_context; /* swap front and back buffers */ - gr_active_fb = (gr_active_fb + 1) & 1; + if (double_buffering) + gr_active_fb = (gr_active_fb + 1) & 1; + +#ifdef BOARD_HAS_FLIPPED_SCREEN + /* flip buffer 180 degrees for devices with physicaly inverted screens */ + unsigned int i; + for (i = 1; i < (vi.xres * vi.yres); i++) { + unsigned short tmp = gr_mem_surface.data[i]; + gr_mem_surface.data[i] = gr_mem_surface.data[(vi.xres * vi.yres * 2) - i]; + gr_mem_surface.data[(vi.xres * vi.yres * 2) - i] = tmp; + } +#endif /* copy data from the in-memory surface to the buffer we're about * to make active. */ - gr_flip_32((unsigned *)gr_framebuffer[gr_active_fb].data, \ - (unsigned *)gr_mem_surface.data, - (fi.line_length * vi.yres)/4); + memcpy(gr_framebuffer[gr_active_fb].data, gr_mem_surface.data, + vi.xres_virtual * vi.yres * PIXEL_SIZE); /* inform the display driver */ set_active_framebuffer(gr_active_fb); @@ -225,22 +288,154 @@ void gr_color(unsigned char r, unsigned char g, unsigned char b, unsigned char a gl->color4xv(gl, color); } -int gr_measure(const char *s) +int gr_measureEx(const char *s, void* font) +{ + GRFont* fnt = (GRFont*) font; + int total = 0; + unsigned pos; + unsigned off; + + if (!fnt) fnt = gr_font; + + while ((off = *s++)) + { + off -= 32; + if (off < 96) + total += (fnt->offset[off+1] - fnt->offset[off]); + } + return total; +} + +unsigned character_width(const char *s, void* pFont) +{ + GRFont *font = (GRFont*) pFont; + unsigned off; + + /* Handle default font */ + if (!font) font = gr_font; + + off = *s - 32; + if (off == 0) + return 0; + + return font->offset[off+1] - font->offset[off]; +} + +int gr_textEx(int x, int y, const char *s, void* pFont) +{ + GGLContext *gl = gr_context; + GRFont *font = (GRFont*) pFont; + unsigned off; + unsigned cwidth; + + /* Handle default font */ + if (!font) font = gr_font; + + gl->bindTexture(gl, &font->texture); + gl->texEnvi(gl, GGL_TEXTURE_ENV, GGL_TEXTURE_ENV_MODE, GGL_REPLACE); + gl->texGeni(gl, GGL_S, GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE); + gl->texGeni(gl, GGL_T, GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE); + gl->enable(gl, GGL_TEXTURE_2D); + + while((off = *s++)) { + off -= 32; + cwidth = 0; + if (off < 96) { + cwidth = font->offset[off+1] - font->offset[off]; + gl->texCoord2i(gl, (font->offset[off]) - x, 0 - y); + gl->recti(gl, x, y, x + cwidth, y + font->cheight); + x += cwidth; + } + } + + return x; +} + +int gr_textExW(int x, int y, const char *s, void* pFont, int max_width) { - return gr_font->cwidth * strlen(s); + GGLContext *gl = gr_context; + GRFont *font = (GRFont*) pFont; + unsigned off; + unsigned cwidth; + + /* Handle default font */ + if (!font) font = gr_font; + + gl->bindTexture(gl, &font->texture); + gl->texEnvi(gl, GGL_TEXTURE_ENV, GGL_TEXTURE_ENV_MODE, GGL_REPLACE); + gl->texGeni(gl, GGL_S, GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE); + gl->texGeni(gl, GGL_T, GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE); + gl->enable(gl, GGL_TEXTURE_2D); + + while((off = *s++)) { + off -= 32; + cwidth = 0; + if (off < 96) { + cwidth = font->offset[off+1] - font->offset[off]; + if ((x + (int)cwidth) < max_width) { + gl->texCoord2i(gl, (font->offset[off]) - x, 0 - y); + gl->recti(gl, x, y, x + cwidth, y + font->cheight); + x += cwidth; + } else { + gl->texCoord2i(gl, (font->offset[off]) - x, 0 - y); + gl->recti(gl, x, y, max_width, y + font->cheight); + x = max_width; + return x; + } + } + } + + return x; } -void gr_font_size(int *x, int *y) +int gr_textExWH(int x, int y, const char *s, void* pFont, int max_width, int max_height) { - *x = gr_font->cwidth; - *y = gr_font->cheight; + GGLContext *gl = gr_context; + GRFont *font = (GRFont*) pFont; + unsigned off; + unsigned cwidth; + int rect_x, rect_y; + + /* Handle default font */ + if (!font) font = gr_font; + + gl->bindTexture(gl, &font->texture); + gl->texEnvi(gl, GGL_TEXTURE_ENV, GGL_TEXTURE_ENV_MODE, GGL_REPLACE); + gl->texGeni(gl, GGL_S, GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE); + gl->texGeni(gl, GGL_T, GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE); + gl->enable(gl, GGL_TEXTURE_2D); + + while((off = *s++)) { + off -= 32; + cwidth = 0; + if (off < 96) { + cwidth = font->offset[off+1] - font->offset[off]; + if ((x + (int)cwidth) < max_width) + rect_x = x + cwidth; + else + rect_x = max_width; + if (y + font->cheight < (unsigned int)(max_height)) + rect_y = y + font->cheight; + else + rect_y = max_height; + + gl->texCoord2i(gl, (font->offset[off]) - x, 0 - y); + gl->recti(gl, x, y, rect_x, rect_y); + x += cwidth; + if (x > max_width) + return x; + } + } + + return x; } -int gr_text(int x, int y, const char *s) +int twgr_text(int x, int y, const char *s) { GGLContext *gl = gr_context; GRFont *font = gr_font; unsigned off; + unsigned cwidth = 0; y -= font->ascent; @@ -253,10 +448,11 @@ int gr_text(int x, int y, const char *s) while((off = *s++)) { off -= 32; if (off < 96) { - gl->texCoord2i(gl, (off * font->cwidth) - x, 0 - y); - gl->recti(gl, x, y, x + font->cwidth, y + font->cheight); + cwidth = font->offset[off+1] - font->offset[off]; + gl->texCoord2i(gl, (off * cwidth) - x, 0 - y); + gl->recti(gl, x, y, x + cwidth, y + font->cheight); } - x += font->cwidth; + x += cwidth; } return x; @@ -266,15 +462,15 @@ void gr_fill(int x, int y, int w, int h) { GGLContext *gl = gr_context; gl->disable(gl, GGL_TEXTURE_2D); - gl->recti(gl, x, y, w, h); + gl->recti(gl, x, y, x + w, y + h); } void gr_blit(gr_surface source, int sx, int sy, int w, int h, int dx, int dy) { if (gr_context == NULL) { return; } - GGLContext *gl = gr_context; + GGLContext *gl = gr_context; gl->bindTexture(gl, (GGLSurface*) source); gl->texEnvi(gl, GGL_TEXTURE_ENV, GGL_TEXTURE_ENV_MODE, GGL_REPLACE); gl->texGeni(gl, GGL_S, GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE); @@ -298,36 +494,130 @@ unsigned int gr_get_height(gr_surface surface) { return ((GGLSurface*) surface)->height; } -static void gr_init_font(void) +void* gr_loadFont(const char* fontName) { + int fd; + GRFont *font = 0; GGLSurface *ftex; unsigned char *bits, *rle; unsigned char *in, data; + unsigned width, height; + unsigned element; + + fd = open(fontName, O_RDONLY); + if (fd == -1) + { + char tmp[128]; + + sprintf(tmp, "/res/fonts/%s.dat", fontName); + fd = open(tmp, O_RDONLY); + if (fd == -1) + return NULL; + } - gr_font = calloc(sizeof(*gr_font), 1); - ftex = &gr_font->texture; + font = calloc(sizeof(*font), 1); + ftex = &font->texture; + + read(fd, &width, sizeof(unsigned)); + read(fd, &height, sizeof(unsigned)); + read(fd, font->offset, sizeof(unsigned) * 96); + font->offset[96] = width; + + bits = malloc(width * height); + memset(bits, 0, width * height); + + unsigned pos = 0; + while (pos < width * height) + { + int bit; + + read(fd, &data, 1); + for (bit = 0; bit < 8; bit++) + { + if (data & (1 << (7-bit))) bits[pos++] = 255; + else bits[pos++] = 0; - bits = malloc(font.width * font.height); + if (pos == width * height) break; + } + } + close(fd); ftex->version = sizeof(*ftex); - ftex->width = font.width; - ftex->height = font.height; - ftex->stride = font.width; + ftex->width = width; + ftex->height = height; + ftex->stride = width; ftex->data = (void*) bits; ftex->format = GGL_PIXEL_FORMAT_A_8; + font->cheight = height; + font->ascent = height - 2; + return (void*) font; +} + +int gr_getFontDetails(void* font, unsigned* cheight, unsigned* maxwidth) +{ + GRFont *fnt = (GRFont*) font; + + if (!fnt) fnt = gr_font; + if (!fnt) return -1; + + if (cheight) *cheight = fnt->cheight; + if (maxwidth) + { + int pos; + *maxwidth = 0; + for (pos = 0; pos < 96; pos++) + { + unsigned int width = fnt->offset[pos+1] - fnt->offset[pos]; + if (width > *maxwidth) + { + *maxwidth = width; + } + } + } + return 0; +} + +static void gr_init_font(void) +{ + int fontRes; + GGLSurface *ftex; + unsigned char *bits, *rle; + unsigned char *in, data; + unsigned width, height; + unsigned element; + + gr_font = calloc(sizeof(*gr_font), 1); + ftex = &gr_font->texture; + + width = font.width; + height = font.height; + + bits = malloc(width * height); + rle = bits; in = font.rundata; - while((data = *in++)) { - memset(bits, (data & 0x80) ? 255 : 0, data & 0x7f); - bits += (data & 0x7f); + while((data = *in++)) + { + memset(rle, (data & 0x80) ? 255 : 0, data & 0x7f); + rle += (data & 0x7f); + } + for (element = 0; element < 97; element++) + { + gr_font->offset[element] = (element * font.cwidth); } - gr_font->cwidth = font.cwidth; - gr_font->cheight = font.cheight; - gr_font->ascent = font.cheight - 2; + ftex->version = sizeof(*ftex); + ftex->width = width; + ftex->height = height; + ftex->stride = width; + ftex->data = (void*) bits; + ftex->format = GGL_PIXEL_FORMAT_A_8; + gr_font->cheight = height; + gr_font->ascent = height - 2; + return; } -int gr_init(void) +int gr_init_orig(void) { gglInit(&gr_context); GGLContext *gl = gr_context; @@ -336,7 +626,6 @@ int gr_init(void) gr_vt_fd = open("/dev/tty0", O_RDWR | O_SYNC); if (gr_vt_fd < 0) { // This is non-fatal; post-Cupcake kernels don't have tty0. - perror("can't open /dev/tty0"); } else if (ioctl(gr_vt_fd, KDSETMODE, (void*) KD_GRAPHICS)) { // However, if we do open tty0, we expect the ioctl to work. perror("failed KDSETMODE to KD_GRAPHICS on tty0"); @@ -346,6 +635,7 @@ int gr_init(void) gr_fb_fd = get_framebuffer(gr_framebuffer); if (gr_fb_fd < 0) { + perror("Unable to get framebuffer.\n"); gr_exit(); return -1; } @@ -355,7 +645,7 @@ int gr_init(void) fprintf(stderr, "framebuffer: fd %d (%d x %d)\n", gr_fb_fd, gr_framebuffer[0].width, gr_framebuffer[0].height); - /* start with 0 as front (displayed) and 1 as back (drawing) */ + /* start with 0 as front (displayed) and 1 as back (drawing) */ gr_active_fb = 0; set_active_framebuffer(0); gl->colorBuffer(gl, &gr_mem_surface); @@ -364,12 +654,31 @@ int gr_init(void) gl->enable(gl, GGL_BLEND); gl->blendFunc(gl, GGL_SRC_ALPHA, GGL_ONE_MINUS_SRC_ALPHA); - gr_fb_blank(true); - gr_fb_blank(false); +// gr_fb_blank(true); +// gr_fb_blank(false); return 0; } +/* + * TODO this is total hax. fix meh please. + * + * Round 1 + * framebuffer: fd 4 (480 x 800) + * + * Round 2 + * framebuffer: fd 6 (480 x 800) + * +*/ +int gr_init(void) { + int ret; + // round 1 + gr_init_orig(); + // lol return the result of round 2 + ret = gr_init_orig(); + return ret; +} + void gr_exit(void) { close(gr_fb_fd); @@ -397,7 +706,7 @@ gr_pixel *gr_fb_data(void) return (unsigned short *) gr_mem_surface.data; } -void gr_fb_blank(bool blank) +void gr_fb_blank(int blank) { int ret; @@ -405,3 +714,34 @@ void gr_fb_blank(bool blank) if (ret < 0) perror("ioctl(): blank"); } + +int gr_get_surface(gr_surface* surface) +{ + GGLSurface* ms = malloc(sizeof(GGLSurface)); + if (!ms) return -1; + + // Allocate the data + get_memory_surface(ms); + + // Now, copy the data + memcpy(ms->data, gr_mem_surface.data, vi.xres * vi.yres * vi.bits_per_pixel / 8); + + *surface = (gr_surface*) ms; + return 0; +} + +int gr_free_surface(gr_surface surface) +{ + if (!surface) + return -1; + + GGLSurface* ms = (GGLSurface*) surface; + free(ms->data); + free(ms); + return 0; +} + +void gr_write_frame_to_file(int fd) +{ + write(fd, gr_mem_surface.data, vi.xres * vi.yres * vi.bits_per_pixel / 8); +} diff --git a/recovery/root/res/images/480x800/battery_01.png b/recovery/root/res/images/480x800/battery_01.png index 153795f..5be0bed 100644 Binary files a/recovery/root/res/images/480x800/battery_01.png and b/recovery/root/res/images/480x800/battery_01.png differ diff --git a/recovery/root/res/images/480x800/battery_02.png b/recovery/root/res/images/480x800/battery_02.png index 92561bc..a3b6bfd 100644 Binary files a/recovery/root/res/images/480x800/battery_02.png and b/recovery/root/res/images/480x800/battery_02.png differ diff --git a/recovery/root/res/images/480x800/battery_03.png b/recovery/root/res/images/480x800/battery_03.png index 6ac1bc0..f18283a 100644 Binary files a/recovery/root/res/images/480x800/battery_03.png and b/recovery/root/res/images/480x800/battery_03.png differ diff --git a/recovery/root/res/images/480x800/battery_04.png b/recovery/root/res/images/480x800/battery_04.png index e2064d3..b5c0272 100644 Binary files a/recovery/root/res/images/480x800/battery_04.png and b/recovery/root/res/images/480x800/battery_04.png differ diff --git a/recovery/root/res/images/480x800/battery_05.png b/recovery/root/res/images/480x800/battery_05.png index 2e11769..61311ec 100644 Binary files a/recovery/root/res/images/480x800/battery_05.png and b/recovery/root/res/images/480x800/battery_05.png differ diff --git a/recovery/root/res/images/480x800/battery_06.png b/recovery/root/res/images/480x800/battery_06.png index 3351de3..8c28121 100644 Binary files a/recovery/root/res/images/480x800/battery_06.png and b/recovery/root/res/images/480x800/battery_06.png differ diff --git a/recovery/root/res/images/480x800/battery_07.png b/recovery/root/res/images/480x800/battery_07.png index 91e3f8e..f208368 100644 Binary files a/recovery/root/res/images/480x800/battery_07.png and b/recovery/root/res/images/480x800/battery_07.png differ diff --git a/recovery/root/res/images/480x800/battery_08.png b/recovery/root/res/images/480x800/battery_08.png index b9b13f8..3278e11 100644 Binary files a/recovery/root/res/images/480x800/battery_08.png and b/recovery/root/res/images/480x800/battery_08.png differ diff --git a/recovery/root/res/images/480x800/battery_09.png b/recovery/root/res/images/480x800/battery_09.png index 358aed1..797201f 100644 Binary files a/recovery/root/res/images/480x800/battery_09.png and b/recovery/root/res/images/480x800/battery_09.png differ diff --git a/recovery/root/res/images/480x800/battery_10.png b/recovery/root/res/images/480x800/battery_10.png index 3da3a22..9115a48 100644 Binary files a/recovery/root/res/images/480x800/battery_10.png and b/recovery/root/res/images/480x800/battery_10.png differ diff --git a/recovery/root/res/images/480x800/battery_11.png b/recovery/root/res/images/480x800/battery_11.png index ef6ab12..9877cf3 100644 Binary files a/recovery/root/res/images/480x800/battery_11.png and b/recovery/root/res/images/480x800/battery_11.png differ diff --git a/recovery/root/res/images/480x800/bg.png b/recovery/root/res/images/480x800/bg.png index f547474..ea43247 100644 Binary files a/recovery/root/res/images/480x800/bg.png and b/recovery/root/res/images/480x800/bg.png differ diff --git a/system.prop b/system.prop index 38fe3af..5726aa3 100644 --- a/system.prop +++ b/system.prop @@ -1,3 +1,3 @@ # # system.prop for u8815 -# +# \ No newline at end of file