Kenji Arai / Mbed OS DISCO-F769NI_several_example

Dependencies:   BD_SD_DISCO_F769NI BSP_DISCO_F769NI LCD_DISCO_F769NI TS_DISCO_F769NI USBHost_F769NI

zz_common/drawImage_copy1.cpp

Committer:
kenjiArai
Date:
2019-08-07
Revision:
3:35ac9ee7d2d6

File content as of revision 3:35ac9ee7d2d6:

/*
 * Mbed function
 *
 *      Created:    July      30th, 2019
 *      Revised:    July      30th, 2019
 */

/*
    https://os.mbed.com/users/Lightsource/code/DISCO-F746NG_BMP_FROM_SDCARD/
    https://www.gimp.org/downloads/
    https://os.mbed.com/questions/69098/how-can-I-load-an-image-to-screen/#answer14107
 */

//#include "select_program.h"
#if defined(NIOI_SENSOR) || defined(EXAMPLE_10_BITMAP)

//  Include --------------------------------------------------------------------
#include "mbed.h"
#include "FATFileSystem.h"
#include "LCD_DISCO_F769NI.h"
#include "stm32f769i_discovery_lcd.h"

//  Definition -----------------------------------------------------------------

//  Constructor ----------------------------------------------------------------
extern Serial pc;
extern FATFileSystem fs;
extern LCD_DISCO_F769NI lcd;

//  RAM ------------------------------------------------------------------------

//  ROM / Constant data --------------------------------------------------------

//  Function prototypes --------------------------------------------------------
//extern void drawImage(const char * name, uint16_t x, uint16_t y);
//extern void draw_bitmap(uint8_t *Name_BMP, uint32_t Xpos, uint32_t Ypos);


//------------------------------------------------------------------------------
//  Control Program
//------------------------------------------------------------------------------
#if 0
void draw_bitmap(uint8_t *Name_BMP, uint32_t Xpos, uint32_t Ypos)
{
    uint32_t index = 0, width = 0, height = 0, bit_pixel = 0;
    uint32_t address;
    uint32_t input_color_mode = 0;
    char filename[50];
    int i, fileSize;
    char * buffer;

    i=0;
    while (*Name_BMP!='\0') {
        filename[i++]=*Name_BMP++;
    }

    filename[i] = 0;
    FILE *Image = fopen((const char *)&filename[0], "rb");  // open the bmp file

    // obtain file size:
    fseek (Image, 0, SEEK_END);
    fileSize = ftell (Image);
    rewind (Image);

    // allocate memory to contain the whole file:
    buffer = (char*) malloc (sizeof(char)*fileSize/2);

    // copy the file into the buffer:
    fseek (Image, 0, SEEK_SET );   // set SD file data start position
    fread (buffer,1,fileSize,Image);
    fclose (Image);

    /* Get bitmap data address offset */
    index = *(__IO uint16_t *) (buffer + 10);
    index |= (*(__IO uint16_t *) (buffer + 12)) << 16;

    /* Read bitmap width */
    width = *(uint16_t *) (buffer + 18);
    width |= (*(uint16_t *) (buffer + 20)) << 16;

    /* Read bitmap height */
    height = *(uint16_t *) (buffer + 22);
    height |= (*(uint16_t *) (buffer + 24)) << 16;

    /* Read bit/pixel */
    bit_pixel = *(uint16_t *) (buffer + 28);

    /* Set the address */
    //address = hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress + (((BSP_LCD_GetXSize()*Ypos) + Xpos)*(4));
    address = hltdc_discovery.LayerCfg[ActiveLayer].FBStartAdress + (((BSP_LCD_GetXSize()*Ypos) + Xpos)*(4));

    /* Get the layer pixel format */
    if ((bit_pixel/8) == 4) {
        input_color_mode = CM_ARGB8888;
    } else if ((bit_pixel/8) == 2) {
        input_color_mode = CM_RGB565;
    } else {
        input_color_mode = CM_RGB888;
    }

    /* Bypass the bitmap header */
    buffer += (index + (width * (height - 1) * (bit_pixel/8)));

    /* Convert picture to ARGB8888 pixel format */
    for(index=0; index < height; index++) {
        /* Pixel format conversion */
        LL_ConvertLineToARGB8888((uint32_t *)buffer, (uint32_t *)address, width, input_color_mode);

        /* Increment the source and destination buffers */
        address+=  (BSP_LCD_GetXSize()*4);
        buffer -= width*(bit_pixel/8);
    }
    free (buffer);
}
#endif
#if 1
void drawImage(const char * name, uint16_t x, uint16_t y)
{
    int fileSize;
    char * buffer;

    FILE *image = fopen(name, "rb");  // open the bmp file
    if (image == 0) {
        pc.printf("%s is not found in the disk\r\n", name);
        return;
    }
    //obtain file size:
    fseek (image, 0, SEEK_END);
    fileSize = ftell (image);
    rewind (image);

    // allocate memory to contain the whole file:
    buffer = (char*) malloc (sizeof(char)*fileSize);
    // copy the file into the buffer:
    fseek (image, 0, SEEK_SET );
    // set SD file data start position
    fread (buffer,1,fileSize,image);
    fclose (image);

    //Draw image
    lcd.DrawBitmap(x,y,(uint8_t *)buffer);
    //Free allocated memory
    free (buffer);
}
#endif
#endif