forked from KolibriOS/kolibrios
- Updated libimg loader.
- Updated kolibri_libimg.h. - Added adapted libimg example from ktcc. git-svn-id: svn://kolibrios.org@8545 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
cef20686d6
commit
7d51fcdeb2
@ -45,14 +45,13 @@ import lib_libimg, \
|
||||
img_flip_layer, 'img_flip_layer', \
|
||||
img_rotate, 'img_rotate', \
|
||||
img_rotate_layer, 'img_rotate_layer', \
|
||||
img_draw, 'img_draw'
|
||||
img_draw, 'img_draw', \
|
||||
img_blend, 'img_blend', \
|
||||
img_convert, 'img_convert', \
|
||||
img_resize_data, 'img_resize_data', \
|
||||
img_scale, 'img_scale'
|
||||
|
||||
public libimg_init as '_libimg_init'
|
||||
; public img_is_img as '_img_is_img'
|
||||
;public img_info as '_img_info'
|
||||
;public img_from_file as '_img_from_file'
|
||||
;public img_to_file as '_img_to_file'
|
||||
;public img_from_rgb as '_img_from_rgb'
|
||||
public img_to_rgb as '_img_to_rgb'
|
||||
public img_to_rgb2 as '_img_to_rgb2'
|
||||
public img_decode as '_img_decode'
|
||||
@ -61,10 +60,12 @@ public img_create as '_img_create'
|
||||
public img_destroy as '_img_destroy'
|
||||
public img_destroy_layer as '_img_destroy_layer'
|
||||
public img_count as '_img_count'
|
||||
;public img_lock_bits as '_img_lock_bits'
|
||||
;public img_unlock_bits as '_img_unlock_bits'
|
||||
public img_flip as '_img_flip'
|
||||
public img_flip_layer as '_img_flip_layer'
|
||||
public img_rotate as '_img_rotate'
|
||||
public img_rotate_layer as '_img_rotate_layer'
|
||||
public img_draw as '_img_draw'
|
||||
public img_blend as '_img_blend'
|
||||
public img_convert as '_img_convert'
|
||||
public img_resize_data as '_img_resize_data'
|
||||
public img_scale as '_img_scale'
|
||||
|
25
contrib/C_Layer/EXAMPLE/img_example/Makefile
Normal file
25
contrib/C_Layer/EXAMPLE/img_example/Makefile
Normal file
@ -0,0 +1,25 @@
|
||||
NAME=img_example
|
||||
CC = kos32-gcc
|
||||
LD = kos32-ld
|
||||
|
||||
SDK_DIR:= $(abspath ../../../sdk)
|
||||
CLAYER:= $(abspath ../../)
|
||||
|
||||
LDFLAGS = -static -S -nostdlib -T $(SDK_DIR)/sources/newlib/app.lds \
|
||||
--image-base 0
|
||||
|
||||
CFLAGS = -c -fno-ident -O2 -fomit-frame-pointer -fno-ident -U__WIN32__ -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32
|
||||
|
||||
INCLUDES= -I. -I$(SDK_DIR)/sources/newlib/libc/include -I$(CLAYER)/INCLUDE
|
||||
LIBPATH:= -L $(SDK_DIR)/lib -L /home/autobuild/tools/win32/mingw32/lib
|
||||
|
||||
OBJPATH = $(CLAYER)/OBJ
|
||||
|
||||
all:
|
||||
$(CC) $(CFLAGS) $(INCLUDES) $(SOURCES) main.c
|
||||
$(LD) $(LIBPATH) $(LDFLAGS) --subsystem native main.o $(OBJPATH)/loadlibimg.obj -o $(NAME) -lgcc -lc.dll
|
||||
strip -S $(NAME)
|
||||
objcopy $(NAME) -O binary
|
||||
|
||||
clean:
|
||||
-rm -f *.o
|
BIN
contrib/C_Layer/EXAMPLE/img_example/logo.png
Normal file
BIN
contrib/C_Layer/EXAMPLE/img_example/logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 51 KiB |
98
contrib/C_Layer/EXAMPLE/img_example/main.c
Executable file
98
contrib/C_Layer/EXAMPLE/img_example/main.c
Executable file
@ -0,0 +1,98 @@
|
||||
/* Written by turbocat2001 (Logaev Maxim) */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
#include <kolibri_libimg.h>
|
||||
#include <kos32sys.h>
|
||||
|
||||
#define NEW_IMG_H 128
|
||||
#define NEW_IMG_W 128
|
||||
|
||||
#define IMG_H 256
|
||||
#define IMG_W 256
|
||||
|
||||
Image *image_blend; // Create image struct
|
||||
|
||||
struct kolibri_system_colors sys_color_table; // Create system colors table
|
||||
|
||||
char* load_img(char* fname, int32_t* read_sz){ // Image file upload function
|
||||
FILE *f = fopen(fname, "rb");
|
||||
if (!f) {
|
||||
printf("Can't open file: %s\n", fname);
|
||||
exit(0);
|
||||
}
|
||||
if (fseek(f, 0, SEEK_END)) {
|
||||
printf("Can't SEEK_END file: %s\n", fname);
|
||||
exit(0);
|
||||
}
|
||||
int filesize = ftell(f);
|
||||
rewind(f);
|
||||
char* fdata = malloc(filesize);
|
||||
if(!fdata) {
|
||||
printf("No memory for file %s\n", fname);
|
||||
exit(0);
|
||||
}
|
||||
*read_sz = fread(fdata, 1, filesize, f);
|
||||
if (ferror(f)) {
|
||||
printf("Error reading file %s\n", fname);
|
||||
exit(0);
|
||||
}
|
||||
fclose(f);
|
||||
return fdata;
|
||||
}
|
||||
|
||||
void DrawGUI(){
|
||||
begin_draw();
|
||||
sys_create_window(10, 40, (IMG_W+NEW_IMG_W)+50, IMG_H+50, "Libimg", sys_color_table.work_area, 0x34);
|
||||
img_draw(image_blend, 10, 10, IMG_W*2, IMG_H , 0, 0); // Draw blended image to window
|
||||
end_draw();
|
||||
}
|
||||
|
||||
int main(){
|
||||
if (kolibri_libimg_init() == -1){
|
||||
printf("Error loading lib_img.obj\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
get_system_colors(&sys_color_table); // Get system colors theme
|
||||
|
||||
uint32_t img_size;
|
||||
void *file_data = load_img("logo.png", &img_size); // Get RAW data and size
|
||||
|
||||
Image* image = img_decode(file_data, img_size, 0); // Decode RAW data to Image data
|
||||
|
||||
if (image->Type != IMAGE_BPP32) {
|
||||
image = img_convert(image, NULL, IMAGE_BPP32, 0, 0); // Convert image to format BPP32
|
||||
if (!image) {
|
||||
printf("Сonvert error!: \n");
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
image_blend = img_create(IMG_W+NEW_IMG_W, IMG_H, IMAGE_BPP32); // Create an empty layer
|
||||
img_fill_color(image_blend, IMG_W+NEW_IMG_W, IMG_H, sys_color_table.work_area); // Fill the layer with one color
|
||||
img_blend(image_blend, image, 0, 0, 0, 0, IMG_W, IMG_H); // Blending images to display the alpha channel.
|
||||
/* Reduce image size from 256x256 to 128x128 */
|
||||
image = img_scale(image, 0, 0, IMG_W, IMG_H, NULL, LIBIMG_SCALE_STRETCH , LIBIMG_INTER_BILINEAR, NEW_IMG_W, NEW_IMG_H);
|
||||
img_blend(image_blend, image, 256, 0, 0, 0, NEW_IMG_W, NEW_IMG_H);
|
||||
img_destroy(image); // Destroy image structure
|
||||
free(file_data); // Free allocated file_data buffer
|
||||
|
||||
set_wanted_events_mask(0xC0000027);
|
||||
|
||||
/* Main event loop */
|
||||
while (1) {
|
||||
switch(get_os_event()){
|
||||
case KOLIBRI_EVENT_REDRAW:
|
||||
DrawGUI();
|
||||
break;
|
||||
case KOLIBRI_EVENT_BUTTON:
|
||||
if (get_os_button() == 1){
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
@ -1,8 +1,15 @@
|
||||
/* Written by turbocat2001 (Logaev Maxim) */
|
||||
|
||||
#ifndef KOLIBRI_LIBIMG_H
|
||||
#define KOLIBRI_LIBIMG_H
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
extern int kolibri_libimg_init(void);
|
||||
|
||||
#define _stdcall __attribute__((__stdcall__))
|
||||
|
||||
//list of format id's
|
||||
#define LIBIMG_FORMAT_BMP 1
|
||||
#define LIBIMG_FORMAT_ICO 2
|
||||
@ -19,6 +26,52 @@ extern int kolibri_libimg_init(void);
|
||||
#define LIBIMG_FORMAT_XBM 13
|
||||
#define LIBIMG_FORMAT_Z80 14
|
||||
|
||||
#pragma pack(push, 1)
|
||||
typedef struct{
|
||||
uint32_t Checksum; // ((Width ROL 16) OR Height) XOR Data[0] ; ignored so far
|
||||
uint32_t Width;
|
||||
uint32_t Height;
|
||||
uint32_t Next;
|
||||
uint32_t Previous;
|
||||
uint32_t Type; // one of Image.bppN
|
||||
uint32_t* Data;
|
||||
uint32_t Palette; // used iff Type eq Image.bpp1, Image.bpp2, Image.bpp4 or Image.bpp8i
|
||||
uint32_t Extended;
|
||||
uint32_t Flags; // bitfield
|
||||
uint32_t Delay; // used iff Image.IsAnimated is set in Flags
|
||||
} Image;
|
||||
#pragma pack(pop)
|
||||
|
||||
#define IMAGE_BPP8i 1 // indexed
|
||||
#define IMAGE_BPP24 2
|
||||
#define IMAGE_BPP32 3
|
||||
#define IMAGE_BPP15 4
|
||||
#define IMAGE_BPP16 5
|
||||
#define IMAGE_BPP1 6
|
||||
#define IMAGE_BPP8g 7 // grayscale
|
||||
#define IMAGE_BPP2i 8
|
||||
#define IMAGE_BPP4i 9
|
||||
#define IMAGE_BPP8a 10
|
||||
|
||||
// scale type
|
||||
#define LIBIMG_SCALE_NONE 0
|
||||
#define LIBIMG_SCALE_INTEGER 1
|
||||
#define LIBIMG_SCALE_TILE 2
|
||||
#define LIBIMG_SCALE_STRETCH 3
|
||||
#define LIBIMG_SCALE_FIT_BOTH LIBIMG_SCALE_STRETCH
|
||||
#define LIBIMG_SCALE_FIT_MIN 4
|
||||
#define LIBIMG_SCALE_FIT_RECT LIBIMG_SCALE_FIT_MIN
|
||||
#define LIBIMG_SCALE_FIT_WIDTH 5
|
||||
#define LIBIMG_SCALE_FIT_HEIGHT 6
|
||||
#define LIBIMG_SCALE_FIT_MAX 7
|
||||
|
||||
// interpolation algorithm
|
||||
#define LIBIMG_INTER_NONE 0 // use it with LIBIMG_SCALE_INTEGER, LIBIMG_SCALE_TILE, etc
|
||||
#define LIBIMG_INTER_BILINEAR 1
|
||||
#define LIBIMG_INTER_BICUBIC 2
|
||||
#define LIBIMG_INTER_LANCZOS 3
|
||||
#define LIBIMG_INTER_DEFAULT LIBIMG_INTER_BILINEAR
|
||||
|
||||
//error codes
|
||||
#define LIBIMG_ERROR_OUT_OF_MEMORY 1
|
||||
#define LIBIMG_ERROR_FORMAT 2
|
||||
@ -37,7 +90,6 @@ extern int kolibri_libimg_init(void);
|
||||
#define LIBIMG_ENCODE_DELETE_ALPHA 0x08
|
||||
#define LIBIMG_ENCODE_FLUSH_ALPHA 0x10
|
||||
|
||||
|
||||
#define FLIP_VERTICAL 0x01
|
||||
#define FLIP_HORIZONTAL 0x02
|
||||
|
||||
@ -47,18 +99,28 @@ extern int kolibri_libimg_init(void);
|
||||
#define ROTATE_90_CCW ROTATE_270_CW
|
||||
#define ROTATE_270_CCW ROTATE_90_CW
|
||||
|
||||
extern void* (*img_decode)(void *, uint32_t, uint32_t) __attribute__((__stdcall__));
|
||||
extern void* (*img_encode)(void *, uint32_t, uint32_t) __attribute__((__stdcall__));
|
||||
extern void* (*img_create)(uint32_t, uint32_t, uint32_t) __attribute__((__stdcall__));
|
||||
extern void (*img_to_rgb2)(void *, void *) __attribute__((__stdcall__));
|
||||
extern void* (*img_to_rgb)(void *) __attribute__((__stdcall__));
|
||||
extern uint32_t (*img_flip)(void *, uint32_t) __attribute__((__stdcall__));
|
||||
extern uint32_t (*img_flip_layer)(void *, uint32_t) __attribute__((__stdcall__));
|
||||
extern uint32_t (*img_rotate)(void *, uint32_t) __attribute__((__stdcall__));
|
||||
extern uint32_t (*img_rotate_layer)(void *, uint32_t) __attribute__((__stdcall__));
|
||||
extern void (*img_draw)(void *, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t ) __attribute__((__stdcall__));
|
||||
extern uint32_t (*img_count)(void *) __attribute__((__stdcall__));
|
||||
extern uint32_t (*img_destroy)(void *) __attribute__((__stdcall__));
|
||||
extern uint32_t (*img_destroy_layer)(void *) __attribute__((__stdcall__));
|
||||
extern Image* (*img_decode)(void* file_data, uint32_t size, uint32_t b_color) _stdcall;
|
||||
extern Image* (*img_encode)(Image* img, uint32_t length, uint32_t option) _stdcall;
|
||||
extern Image* (*img_create)(uint32_t width, uint32_t height, uint32_t type) _stdcall;
|
||||
extern void (*img_to_rgb2)(Image* img, void *rgb_data) _stdcall;
|
||||
extern Image* (*img_to_rgb)(Image* img) _stdcall;
|
||||
extern bool (*img_flip)(Image* img, uint32_t flip) _stdcall;
|
||||
extern bool (*img_flip_layer)(Image *img, uint32_t flip) _stdcall;
|
||||
extern bool (*img_rotate)(Image *img, uint32_t rotate) _stdcall;
|
||||
extern bool (*img_rotate_layer)(Image* data, uint32_t rotate) _stdcall;
|
||||
extern void (*img_draw)(Image *img, uint32_t x, uint32_t y, uint32_t w, uint32_t h, uint32_t xoff, uint32_t yoff) _stdcall;
|
||||
extern int32_t (*img_count)(Image *img) _stdcall;
|
||||
extern bool (*img_destroy)(Image *img) _stdcall;
|
||||
extern bool (*img_destroy_layer)(Image* img) _stdcall;
|
||||
extern Image* (*img_blend)(Image* dst, Image* src, uint32_t out_x, uint32_t out_y, uint32_t in_x, uint32_t in_y, uint32_t width, uint32_t height) _stdcall;
|
||||
extern Image* (*img_convert)(Image *src, Image *dst, uint32_t dst_type, uint32_t, uint32_t) _stdcall;
|
||||
extern Image* (*img_resize_data)(Image *src, uint32_t width, uint32_t height) _stdcall;
|
||||
extern Image* (*img_scale)(Image* src, uint32_t crop_x, uint32_t crop_y, uint32_t crop_width, uint32_t crop_height, Image* dst, uint32_t scale_type, uint32_t inter, uint32_t new_width, uint32_t new_height) _stdcall;
|
||||
|
||||
void img_fill_color(Image* img, uint32_t width, uint32_t height, uint32_t color){
|
||||
for (uint32_t i = 0; i < width*height; i++) {
|
||||
img->Data[i] = color;
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* KOLIBRI_LIBIMG_H */
|
||||
|
Loading…
Reference in New Issue
Block a user