kolibrios-gitea/programs/cmm/lib/obj/libimg.h

244 lines
6.7 KiB
C
Raw Normal View History

//Asper
#ifndef INCLUDE_LIBIMG_H
#define INCLUDE_LIBIMG_H
#ifndef INCLUDE_KOLIBRI_H
#include "../lib/kolibri.h"
#endif
#ifndef INCLUDE_MEM_H
#include "../lib/mem.h"
#endif
#ifndef INCLUDE_DLL_H
#include "../lib/dll.h"
#endif
#ifndef INCLUDE_LIBIO_H
#include "../lib/obj/libio.h"
#endif
//library
dword libimg = #alibimg;
char alibimg[] = "/sys/lib/libimg.obj";
dword libimg_init = #alibimg_init;
dword img_is_img = #aimg_is_img;
dword img_to_rgb2 = #aimg_to_rgb2;
dword img_decode = #aimg_decode;
dword img_destroy = #aimg_destroy;
dword img_draw = #aimg_draw;
dword img_create = #aimg_create;
dword img_encode = #aimg_encode;
//dword img_flip = #aimg_flip;
//dword img_rotate = #aimg_rotate;
$DD 2 dup 0
//import libimg , \
char alibimg_init[] = "lib_init";
char aimg_is_img[] = "img_is_img";
char aimg_to_rgb2[] = "img_to_rgb2";
char aimg_decode[] = "img_decode";
char aimg_destroy[] = "img_destroy";
char aimg_draw[] = "img_draw";
char aimg_create[] = "img_create";
char aimg_encode[] = "img_encode";
//char aimg_flip[] = "img_flip";
//char aimg_rotate[] = "img_rotate ";
#define LIBIMG_FORMAT_BMP 1
#define LIBIMG_FORMAT_ICO 2
#define LIBIMG_FORMAT_CUR 3
#define LIBIMG_FORMAT_GIF 4
#define LIBIMG_FORMAT_PNG 5
#define LIBIMG_FORMAT_JPEG 6
#define LIBIMG_FORMAT_TGA 7
#define LIBIMG_FORMAT_PCX 8
#define LIBIMG_FORMAT_XCF 9
#define LIBIMG_FORMAT_TIFF 10
#define LIBIMG_FORMAT_PNM 11
#define LIBIMG_FORMAT_WBMP 12
#define LIBIMG_FORMAT_XBM 13
#define LIBIMG_FORMAT_Z80 14
struct _Image
{
dword Checksum; // ((Width ROL 16) OR Height) XOR Data[0] ; ignored so far
dword Width;
dword Height;
dword Next;
dword Previous;
dword Type; // one of Image.bppN
dword Data;
dword Palette; // used iff Type eq Image.bpp1, Image.bpp2, Image.bpp4 or Image.bpp8i
dword Extended;
dword Flags; // bitfield
dword Delay; // used iff Image.IsAnimated is set in Flags
};
// values for Image.Type
// must be consecutive to allow fast switch on Image.Type in support functions
#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 // grayscale with alpha channel; application layer only!!!
// kernel doesn't handle this image type,
// libimg can only create and destroy such images
:dword load_image(dword filename)
{
//align 4
dword img_data=0;
dword img_data_len=0;
dword fh=0;
dword image=0;
byte tmp_buf[40];
$and img_data, 0
//$mov eax, filename
//$push eax
//invoke file.open, eax, O_READ
file_open stdcall (filename, O_READ);
$or eax, eax
$jnz loc05
$stc
return 0;
@loc05:
$mov fh, eax
//invoke file.size
file_size stdcall (filename);
$mov img_data_len, ebx
//stdcall mem.Alloc, ebx
mem_Alloc(EBX);
$test eax, eax
$jz error_close
$mov img_data, eax
//invoke file.read, [fh], eax, [img_data_len]
file_read stdcall (fh, EAX, img_data_len);
$cmp eax, -1
$jz error_close
$cmp eax, img_data_len
$jnz error_close
//invoke file.close, [fh]
file_close stdcall (fh);
$inc eax
$jz error_
//; img.decode checks for img.is_img
//; //invoke img.is_img, [img_data], [img_data_len]
//; $or eax, eax
//; $jz exit
//invoke img.decode, [img_data], [img_data_len], 0
EAX=img_data;
img_decode stdcall (EAX, img_data_len,0);
$or eax, eax
$jz error_
$cmp image, 0
$pushf
$mov image, eax
//call init_frame
$popf
//call update_image_sizes
mem_Free(img_data);//free_img_data(img_data);
$clc
return image;
@error_free:
//invoke img.destroy, [image]
img_destroy stdcall (image);
$jmp error_
@error_pop:
$pop eax
$jmp error_
@error_close:
//invoke file.close, [fh]
file_close stdcall (fh);
@error_:
mem_Free(img_data);
$stc
return 0;
}
:dword create_image(dword type, dword width, dword height) {
img_create stdcall(width, height, type);
return EAX;
}
// size - output parameter, error code / the size of encoded data
:dword encode_image(dword image_ptr, dword options, dword specific_options, dword* size) {
img_encode stdcall(image_ptr, options, specific_options);
ESDWORD[size] = ECX;
return EAX;
}
:void DrawLibImage(dword image_pointer,x,y,w,h,offx,offy) {
img_draw stdcall (
image_pointer,
x,
y,
w,
h,
offx,
offy
);
}
//NOTICE: DO NOT FORGET TO INIT libio AND libimg!!!
#ifdef LANG_RUS
#define TEXT_FILE_SAVED_AS "'File saved as "
#else
#define TEXT_FILE_SAVED_AS "'<27><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E0A0AD> <20><><EFBFBD> "
#endif
:void save_image(dword _image_pointer, _w, _h, _path)
{
char save_success_message[4096+200];
dword encoded_data=0;
dword encoded_size=0;
dword image_ptr = 0;
image_ptr = create_image(Image_bpp24, _w, _h);
if (image_ptr == 0) {
notify("'Error saving file, probably not enought memory!' -E");
}
else {
EDI = image_ptr;
memmov(EDI._Image.Data, _image_pointer, _w * _h * 3);
encoded_data = encode_image(image_ptr, LIBIMG_FORMAT_PNG, 0, #encoded_size);
img_destroy stdcall(image_ptr);
if(encoded_data == 0) {
notify("'Error saving file, incorrect data!' -E");
}
else {
if (CreateFile(encoded_size, encoded_data, _path) == 0) {
strcpy(#save_success_message, TEXT_FILE_SAVED_AS);
strcat(#save_success_message, _path);
strcat(#save_success_message, "' -O");
notify(#save_success_message);
}
else {
notify("'Error saving image file!\nNot enough space? Path wrong?\nFile system is not writable?..' -E");
}
}
}
}
#ifndef INCLUDE_LIBIMG_LOAD_SKIN_H
#include "../lib/patterns/libimg_load_skin.h"
#endif
#endif