diff --git a/kernel/branches/kolibri_pe/docs/sysfuncr.txt b/kernel/branches/kolibri_pe/docs/sysfuncr.txt index 89f32591fa..0d27bd762d 100644 --- a/kernel/branches/kolibri_pe/docs/sysfuncr.txt +++ b/kernel/branches/kolibri_pe/docs/sysfuncr.txt @@ -3402,9 +3402,9 @@ IPC * ebx = указатель на изображение * ecx = [размер по оси x]*65536 + [размер по оси y] * edx = [координата по оси x]*65536 + [координата по оси y] - * esi = число бит на пиксель, должно быть 8, 24 или 32 + * esi = число бит на пиксель, должно быть 8, 16, 24 или 32 * edi = указатель на палитру (256 цветов 0x00RRGGBB); - игнорируется при esi = 24 и 32 + игнорируется при esi = 16, 24 и 32 * ebp = смещение данных каждой следующей строки изображения относительно предыдущей Возвращаемое значение: @@ -3413,9 +3413,18 @@ IPC * Координаты изображения - это координаты верхнего левого угла изображения относительно окна. * Размер изображения в байтах есть xsize*ysize. - * Каждый байт изображения рассматривается как индекс в палитре. + * Формат изображения с 8 битами на пиксель: каждый байт изображения + рассматривается как индекс в палитре. * Если изображение использует не все 256 цветов, а меньше, размер палитры может быть меньше 256. + * Формат изображения с 16 битами на пиксель: цвет каждого пикселя + кодируется как (в битовом представлении) 0RRRRRGGGGGBBBBB - + по 5 пикселей на каждый цвет. + * Формат изображения с 24 битами на пиксель: цвет каждого пикселя + кодируется тремя байтами - последовательно синяя, зелёная, + красная составляющие цвета. + * Формат изображения с 32 битами на пиксель: аналогично 24, только + есть ещё игнорируемый четвёртый байт. * Вызов функции 7 эквивалентен вызову этой функции с параметрами esi=24, ebp=0. diff --git a/kernel/branches/kolibri_pe/kernel.asm b/kernel/branches/kolibri_pe/kernel.asm index 719060635c..794b46162c 100644 --- a/kernel/branches/kolibri_pe/kernel.asm +++ b/kernel/branches/kolibri_pe/kernel.asm @@ -4235,6 +4235,12 @@ sys_putimage_palette: mov ebp, putimage_get8bpp mov esi, putimage_init8bpp jmp sys_putimage_bpp +@@: + cmp esi, 16 + jnz @f + mov ebp, putimage_get16bpp + mov esi, putimage_init16bpp + jmp sys_putimage_bpp @@: cmp esi, 24 jnz @f @@ -4248,7 +4254,7 @@ sys_putimage_palette: mov esi, putimage_init32bpp jmp sys_putimage_bpp @@: - pop ebp esi + pop ebp esi ebp ret putimage_init24bpp: @@ -4276,6 +4282,27 @@ putimage_get32bpp: lodsd ret 4 +putimage_init16bpp: + add eax, eax + ret +putimage_get16bpp: +; 0RRRRRGGGGGBBBBB -> 00000000RRRRR000GGGGG000BBBBB000 + push ecx edx + movzx eax, word [esi] + add esi, 2 + mov ecx, eax + mov edx, eax + and eax, 0x1F + and ecx, 0x1F shl 5 + and edx, 0x1F shl 10 + shl eax, 3 + shl ecx, 6 + shl edx, 9 + or eax, ecx + or eax, edx + pop edx ecx + ret + ; eax x beginning ; ebx y beginning ; ecx x end