static void CursorRender()
{
    if (!s3ePointerGetInt(S3E_POINTER_AVAILABLE))
        return;

    uint16* ptr = (uint16*)s3eSurfacePtr();
    int height = s3eSurfaceGetInt(S3E_SURFACE_HEIGHT);
    int width = s3eSurfaceGetInt(S3E_SURFACE_WIDTH);
    int pitch = s3eSurfaceGetInt(S3E_SURFACE_PITCH);

    int pointerx = s3ePointerGetX();
    int pointery = s3ePointerGetY();

    pointerx = (pointerx > width)?width-1:pointerx;
    pointery = (pointery > height)?height-1:pointery;

    int cursor_size = 10;

    for (int y = pointery-cursor_size; y < pointery+cursor_size; y++)
    {
        if (y < 0 || y >= height)
            continue;
        int location = y*pitch/sizeof(uint16) + pointerx;
        ptr[location] = 0x5555;
    }

    for (int x = pointerx-cursor_size; x < pointerx+cursor_size; x++)
    {
        if (x < 0 || x >= width)
            continue;
        int location = pointery*pitch/sizeof(uint16) + x;
        ptr[location] = 0x5555;
    }
}
Пример #2
0
void fillScreen(uint8 r, uint8 g, uint8 b)
{
    uint16* screen = (uint16*)s3eSurfacePtr();
    uint16  colour = (uint16)s3eSurfaceConvertRGB(r,g,b);
    int32 width = s3eSurfaceGetInt(S3E_SURFACE_WIDTH);
    int32 height = s3eSurfaceGetInt(S3E_SURFACE_HEIGHT);
    int32 pitch = s3eSurfaceGetInt(S3E_SURFACE_PITCH);
    for (int y = 0; y < height; y++)
        for (int x = 0; x < width; x++)
            screen[y * pitch/2 + x] = colour;
}
void DrawRect(int x, int y, int width, int height, uint8 r, uint8 g, uint8 b)
{
    int right = x + width;
    int bottom = y + height;
    int pitch = s3eSurfaceGetInt(S3E_SURFACE_PITCH);
    if (x < 0)
        x = 0;
    if (y < 0)
        y = 0;
    if (right > (int32)s3eSurfaceGetInt(S3E_SURFACE_WIDTH))
        right = s3eSurfaceGetInt(S3E_SURFACE_WIDTH);
    if (bottom > (int32)s3eSurfaceGetInt(S3E_SURFACE_HEIGHT))
        bottom = s3eSurfaceGetInt(S3E_SURFACE_HEIGHT);

    uint16* pSurface = (uint16*)s3eSurfacePtr();
    pitch /= 2;
    uint16 colour = (uint16)s3eSurfaceConvertRGB(r,g,b);

    if (((right - x) & 0x3) == 0)
    {
        for (int _y = y; _y < bottom; _y++)
        {
            uint16* p = pSurface + _y*pitch + x;
            uint16* pEnd = p + right - x;

            do
            {
                *p++ = colour;
                *p++ = colour;
                *p++ = colour;
                *p++ = colour;
            } while (p != pEnd);
        }
    }
    else
    {
        for (int _y = y; _y < bottom; _y++)
        {
            uint16* p = pSurface + _y*pitch + x;
            uint16* pEnd = p + right - x;

            do
            {
                *p++ = colour;
            } while (p != pEnd);
        }
    }
}
Пример #4
0
void onRender() {
	// Get pointer to the screen surface
	// (pixel depth is 2 bytes by default)
	uint16* screen = (uint16*)s3eSurfacePtr();
	int height = s3eSurfaceGetInt(S3E_SURFACE_HEIGHT);
	int width = s3eSurfaceGetInt(S3E_SURFACE_WIDTH);
	int pitch = s3eSurfaceGetInt(S3E_SURFACE_PITCH);
	
	// Clear screen to white
	for (int i=0; i < height; i++)
	{
		memset((char*)screen + pitch * i, 255, (width * 2));
	}
	// Print Hello World
	s3eDebugPrint(10, 20, "`x000000Hello World", 0);
}
Пример #5
0
// Helper function to display message for Debug-Only Examples
void DisplayMessage(const char* strmessage)
{
    uint16* screen = (uint16*)s3eSurfacePtr();
    int32 width     = s3eSurfaceGetInt(S3E_SURFACE_WIDTH);
    int32 height    = s3eSurfaceGetInt(S3E_SURFACE_HEIGHT);
    int32 pitch     = s3eSurfaceGetInt(S3E_SURFACE_PITCH);
    for (int y = 0; y < height; y++)
    for (int x = 0; x < width; x++)
        screen[y * pitch/2 + x] = 0;
    s3eDebugPrint(0, 10, strmessage, 1);
    s3eSurfaceShow();
    while (!s3eDeviceCheckQuitRequest() && !s3eKeyboardAnyKey())
    {
        s3eDeviceYield(0);
        s3eKeyboardUpdate();
    }
}
Пример #6
0
void DrawRect(int x, int y, int width, int height, uint8 r, uint8 g, uint8 b)
{
    int right = x + width;
    int bottom = y + height;
    if (x < 0)
        x = 0;
    if (y < 0)
        y = 0;
    if (right > S3E_SURFACE_DEVICE_WIDTH)
        right = S3E_SURFACE_DEVICE_WIDTH;
    if (bottom > S3E_SURFACE_DEVICE_HEIGHT)
        bottom = S3E_SURFACE_DEVICE_HEIGHT;

    uint16* pSurface = (uint16*)s3eSurfacePtr();
    uint16 colour = (uint16)s3eSurfaceConvertRGB(r,g,b);

    if (((right - x) & 0x3) == 0)
    {
        for (int _y = y; _y < bottom; _y++)
        {
            uint16* p = pSurface + _y + x;
            uint16* pEnd = p + right - x;

            do
            {
                *p++ = colour;
                *p++ = colour;
                *p++ = colour;
                *p++ = colour;
            } while (p != pEnd);
        }
    }
    else
    {
        for (int _y = y; _y < bottom; _y++)
        {
            uint16* p = pSurface + _y + x;
            uint16* pEnd = p + right - x;

            do
            {
                *p++ = colour;
            } while (p != pEnd);
        }
    }
}
Пример #7
0
void ExampleRender()
{
    // Get pointer to the screen surface
    // (pixel depth is 2 bytes by default)
    uint16* screen = (uint16*)s3eSurfacePtr();
    int height = s3eSurfaceGetInt(S3E_SURFACE_HEIGHT);
    int width = s3eSurfaceGetInt(S3E_SURFACE_WIDTH);
    int pitch = s3eSurfaceGetInt(S3E_SURFACE_PITCH);
    
    // Clear screen to white
    for (int i=0; i < height; i++)
    {
        memset((char*)screen + pitch * i, 255, (width * 2));
    }
    
    // This was causing an error to pop up.
    s3ePointerUpdate();
    
    ButtonsRender();
    
    s3eDebugPrint(20, 365, g_TouchEventMsg, 1);
}
Пример #8
0
bool s3eExampleShowFromBuffer_jpeglib(void* data, uint32 len, int32 x, int32 y, int32 width, int32 height)
{
    jpeg_decompress_struct cinfo;
    bzero(&cinfo, sizeof(cinfo));

    JSAMPARRAY buffer;      /* Output row buffer */
    int row_stride;     /* physical row width in output buffer */

    jpeg_source_mgr srcmgr;

    srcmgr.bytes_in_buffer = len;
    srcmgr.next_input_byte = (JOCTET*) data;
    srcmgr.init_source = JPEGInitSource;
    srcmgr.fill_input_buffer = JPEGFillInputBuffer;
    srcmgr.skip_input_data = JPEGSkipInputData;
    srcmgr.resync_to_restart = jpeg_resync_to_restart;
    srcmgr.term_source = JPEGTermSource;

    jpeg_error_mgr jerr;
    cinfo.err = jpeg_std_error(&jerr);

    jpeg_create_decompress(&cinfo);
    cinfo.src = &srcmgr;

    jpeg_read_header(&cinfo, TRUE);
    jpeg_start_decompress(&cinfo);

    uint8* dest = (uint8*)s3eSurfacePtr();
    int destpitch = s3eSurfaceGetInt(S3E_SURFACE_PITCH);
    s3eSurfacePixelType ptype = (s3eSurfacePixelType)s3eSurfaceGetInt(S3E_SURFACE_PIXEL_TYPE);
    int bytesPerPix = (ptype & S3E_SURFACE_PIXEL_SIZE_MASK) >> 4;

    /* JSAMPLEs per row in output buffer */
    row_stride = cinfo.output_width * cinfo.output_components;

    /* Make a one-row-high sample array that will go away when done with image */
    buffer = (*cinfo.mem->alloc_sarray)
        ((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);

    int startx = 0;
    int starty = 0;
    if(y + height > s3eSurfaceGetInt(S3E_SURFACE_HEIGHT))
        height = s3eSurfaceGetInt(S3E_SURFACE_HEIGHT) - y;
    if(y < 0 )
    {
        height += y;
        starty -= y;
        y       = 0;
    }

    if (x + width > s3eSurfaceGetInt(S3E_SURFACE_WIDTH))
        width = s3eSurfaceGetInt(S3E_SURFACE_WIDTH) - x;

    if (x < 0 )
    {
        width +=x;
        startx -= x;
        x =0;
    }

    int copy_rows  = MIN((int)cinfo.output_height, height);
    int copy_width = MIN((int)cinfo.output_width,  width);

    dest += y * destpitch + x * bytesPerPix;

    printf("jpeg load: pos=%d %d size=[%dx%d] -> [%dx%d] offset=%dx%d\n", x, y, cinfo.output_width, cinfo.output_height, copy_width, copy_rows, startx, starty);

    if (copy_width < 0 || copy_rows < 0)
    {
        printf("jpeg is fully off screen\n");
        return S3E_RESULT_SUCCESS;
    }

    while (cinfo.output_scanline < cinfo.output_height)// count through the image
    {
        /* jpeg_read_scanlines expects an array of pointers to scanlines.
         * Here the array is only one element long, but you could ask for
         * more than one scanline at a time if that's more convenient.
         */
        (void) jpeg_read_scanlines(&cinfo, buffer, 1);

        if (starty-- <= 0)// count down from start
        {
            if (copy_rows-- > 0)
            {
                uint8* dst = dest;
                for (int xx=startx; xx < copy_width; xx++)
                {
                    uint8 r = buffer[0][xx*3+0];
                    uint8 b = buffer[0][xx*3+1];
                    uint8 g = buffer[0][xx*3+2];

                    switch(bytesPerPix)
                    {
                    case 1:
                        *dst++ = (uint8)s3eSurfaceConvertRGB( r, b, g);
                        break;
                    case 2:
                        *((uint16*)dst) = (uint16)s3eSurfaceConvertRGB( r, b, g);
                        dst +=2;
                        break;
                    case 3:
                        {
                            uint32 colour = s3eSurfaceConvertRGB( r, b, g);
                            *dst++ = (uint8)(colour);
                            *dst++ = (uint8)(colour >> 8);
                            *dst++ = (uint8)(colour >> 16);
                            dst +=3;
                        }
                        break;
                    case 4:
                         *((uint32*)dst) = s3eSurfaceConvertRGB( r, b, g);
                        dst +=4;
                    default:
                        ;
                    }
                }
                dest += destpitch;
            }
        }
    }