Files
system76-coreboot/payloads/libpayload/include/cbgfx.h
Daisuke Nojiri 9aed1465d7 cbgfx: make the code more descriptive
This change makes the code in graphics.c more descriptive and readable.
Especially, it makes expressions for scale calculation look what they
are meant to do. It also includes:

- Rename variables (struct fraction, dim_org, etc.) for more consistency
- Add more input validation (div-by-zero, etc.)

BUG=chromium:502066
BRANCH=master
TEST=Tested on Samus
CQ-DEPEND=CL:304860

Change-Id: I2694912bb7b6017d5655de2fd655b95432addb22
Signed-off-by: Patrick Georgi <pgeorgi@google.com>
Original-Commit-Id: 0863dc3ee925d3a05c83c66397b19a57f5478ef3
Original-Change-Id: Id8e349b8e09082fb84c3e1a984617f916e16c518
Original-Signed-off-by: Daisuke Nojiri <dnojiri@chromium.org>
Original-Reviewed-on: https://chromium-review.googlesource.com/304861
Original-Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-on: http://review.coreboot.org/11928
Tested-by: build bot (Jenkins)
2015-10-27 15:22:33 +01:00

151 lines
3.9 KiB
C

/*
* This file is part of the libpayload project.
*
* Copyright (C) 2015 Google, Inc.
*/
#include <libpayload.h>
#include <arch/types.h>
#include <stddef.h>
/*
* API error codes
*/
#define CBGFX_SUCCESS 0
/* unknown error */
#define CBGFX_ERROR_UNKNOWN 1
/* failed to initialize cbgfx library */
#define CBGFX_ERROR_INIT 2
/* drawing beyond screen or canvas boundary */
#define CBGFX_ERROR_BOUNDARY 3
/* invalid parameter */
#define CBGFX_ERROR_INVALID_PARAMETER 4
/* bitmap error: signature mismatch */
#define CBGFX_ERROR_BITMAP_SIGNATURE 0x10
/* bitmap error: unsupported format */
#define CBGFX_ERROR_BITMAP_FORMAT 0x11
/* bitmap error: invalid data */
#define CBGFX_ERROR_BITMAP_DATA 0x12
/* bitmap error: scaling out of range */
#define CBGFX_ERROR_SCALE_OUT_OF_RANGE 0x13
struct fraction {
int32_t n;
int32_t d;
};
struct scale {
struct fraction x;
struct fraction y;
};
struct vector {
union {
int32_t x;
int32_t width;
};
union {
int32_t y;
int32_t height;
};
};
struct rect {
struct vector offset;
struct vector size;
};
struct rgb_color {
uint8_t red;
uint8_t green;
uint8_t blue;
};
/*
* Resolution of scale parameters used to describe height, width, coordinate,
* etc. relative to the canvas. For example, if it's 100, scales range from 0 to
* 100%.
*/
#define CANVAS_SCALE 100
/*
* The coordinate system is expected to have (0, 0) at top left corner with
* y values increasing towards bottom of screen.
*/
/**
* Load a bitmap file from cbfs
*
* Memory is allocated automatically and it's caller's responsibility to free it
*
* name: name of the bitmap file
* size: (OUT) size of the image
*
* return: pointer to the image data in memory or NULL on error
*/
void *load_bitmap(const char *name, size_t *size);
/**
* draw a box filled with a color on screen
*
* box: .offset points the coordinate of the top left corner and .size specifies
* width and height of the box. Both are relative to the canvas size thus scale
* from 0 to CANVAS_SCALE (0 to 100%).
* rgb: RGB color of the box.
*
* return: CBGFX_* error codes
*/
int draw_box(const struct rect *box, const struct rgb_color *rgb);
/**
* Clear the canvas
*/
int clear_canvas(const struct rgb_color *rgb);
/**
* Clear the screen
*/
int clear_screen(const struct rgb_color *rgb);
/**
* Draw a bitmap image using position and size relative to the canvas
*
* @param[in] bitmap Pointer to the bitmap data, starting from file header
* @param[in] size Size of the bitmap data
* @param[in] pos_rel Coordinate of the pivot relative to the canvas
* @param[in] pivot Pivot position. Use PIVOT_H_* and PIVOT_V_* flags.
* @param[in] dim_rel Width and height of the image relative to the canvas
* width and height. They must not exceed 1 (=100%). If one
* is zero, it's derived from the other to keep the aspect
* ratio.
*
* @return CBGFX_* error codes
*
* 'Pivot' is a point of the image based on which the image is positioned.
* For example, if a pivot is set to PIVOT_H_CENTER|PIVOT_V_CENTER, the image is
* positioned so that pos_rel matches the center of the image.
*/
int draw_bitmap(const void *bitmap, size_t size,
const struct scale *pos_rel, uint8_t pivot,
const struct scale *dim_rel);
/* Pivot flags. See the draw_bitmap description. */
#define PIVOT_H_LEFT (1 << 0)
#define PIVOT_H_CENTER (1 << 1)
#define PIVOT_H_RIGHT (1 << 2)
#define PIVOT_V_TOP (1 << 3)
#define PIVOT_V_CENTER (1 << 4)
#define PIVOT_V_BOTTOM (1 << 5)
/**
* Draw a bitmap image at screen coordinate with no scaling
*
* @param[in] bitmap Pointer to the bitmap data, starting from file header
* @param[in] size Size of the bitmap data
* @param[in] pos Screen coordinate of upper left corner of the image.
*
* @return CBGFX_* error codes
*/
int draw_bitmap_direct(const void *bitmap, size_t size,
const struct vector *top_left);