kolibrios-fun/programs/cmm/notify/notify.c
Kirill Lipatov (Leency) d8e7f62e43 Notify: small optimization
git-svn-id: svn://kolibrios.org@4474 a494cfbc-eb01-0410-851d-a64ba20cac60
2014-01-18 11:39:28 +00:00

165 lines
3.3 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//notify 0.8
//SoUrcerer 2010, Leency 2012-2013, GNU GPLv2
#define MEMSIZE 0x2F00
#include "..\lib\kolibri.h"
#include "..\lib\strings.h"
#include "..\lib\mem.h"
#include "..\lib\figures.h"
dword shadow_buf_24, shadow_buf_32, lighter_pixel1, lighter_pixel2;
?define PADDING 15;
int SCREEN_SIZE_X,
SCREEN_SIZE_Y;
int WIN_X,
WIN_Y,
WIN_SIZE_X=256,
WIN_SIZE_Y=28;
int TEXT_X=PADDING,
TEXT_Y;
int delay = 400;
#ifndef AUTOBUILD
#include "lang.h--"
#endif
#ifdef LANG_RUS
?define DEFAULT_TEXT "<EFBFBD>â  ¯à®£à ¬¬  ¯®ª §ë¢ ¥â 㢥¤®¬«¥­¨ï.";
#else
?define DEFAULT_TEXT "This program shows notices. Open it with params.";
#endif
void PutText(dword x, y) {
WriteBufText(x,y, 0x88, 0, #param, shadow_buf_32);
}
void Text()
{
PutText(TEXT_X-1,TEXT_Y+1);
PutText(TEXT_X-1,TEXT_Y-1);
PutText(TEXT_X-1,TEXT_Y );
PutText(TEXT_X+1,TEXT_Y-1);
PutText(TEXT_X+1,TEXT_Y );
PutText(TEXT_X+1,TEXT_Y+1);
PutText(TEXT_X, TEXT_Y+1);
PutText(TEXT_X, TEXT_Y-1);
WriteBufText(TEXT_X, TEXT_Y, 0x88, 0xFFFfff, #param, shadow_buf_32);
}
inline fastcall int GetClientTop()
{
$mov eax, 48
$mov ebx, 5
$int 0x40
$mov eax, ebx
$shr eax, 16
}
void from24to32(ESI, EDI, EAX, EBX) //src,dst,w,h
{
conv24to32:
$mul ebx
$mov ecx, eax
$xor al, al
_next:
$movsw
$movsb
$stosb
$loop _next
}
void DrawBackground()
{
PutPaletteImage(shadow_buf_32+8,WIN_SIZE_X,WIN_SIZE_Y,0,0,32,0);
PutPixel(0,0,ESDWORD[lighter_pixel1]);
PutPixel(0,WIN_SIZE_Y-1,ESDWORD[lighter_pixel2]);
}
void GetBackground()
{
int i;
static int was_once;
if (was_once)
{
DrawBackground();
return;
}
for (i=1; i<=6; i++)
{
was_once = 1;
ShadowImage(shadow_buf_24, WIN_SIZE_X, WIN_SIZE_Y, 1);
if (i%2 == 0) ShadowImage(lighter_pixel1, 1, 1, 1);
if (i%2 == 0) ShadowImage(lighter_pixel2, 1, 1, 1);
from24to32(shadow_buf_24, shadow_buf_32+8, WIN_SIZE_X, WIN_SIZE_Y);
Text();
DrawBackground();
pause(5);
}
}
void Exit()
{
ExitProcess();
}
void main()
{
if (!param) strcpy(#param, DEFAULT_TEXT);
if (strlen(#param)*6>WIN_SIZE_X)
{
WIN_SIZE_X=strlen(#param)*6+PADDING;
delay = strlen(#param)*10;
}
SCREEN_SIZE_X=GetScreenWidth()+1;
WIN_X = SCREEN_SIZE_X-WIN_SIZE_X-1;
WIN_Y = GetClientTop();
TEXT_X = -6*strlen(#param)+WIN_SIZE_X/2+1;
TEXT_Y = WIN_SIZE_Y/2-4;
//emulate multithread :)
while (GetPixelColor(SCREEN_SIZE_X-1, SCREEN_SIZE_X, WIN_Y)==0x333333) WIN_Y+=WIN_SIZE_Y+17;
mem_Init();
shadow_buf_24 = malloc(WIN_SIZE_X*WIN_SIZE_Y*3);
shadow_buf_32 = malloc(WIN_SIZE_X*WIN_SIZE_Y*4+8);
lighter_pixel1 = malloc(3);
lighter_pixel2 = malloc(3);
CopyScreen(shadow_buf_24, WIN_X, WIN_Y, WIN_SIZE_X, WIN_SIZE_Y);
CopyScreen(lighter_pixel1, WIN_X, WIN_Y, 1, 1);
CopyScreen(lighter_pixel2, WIN_X, WIN_Y+WIN_SIZE_Y, 1, 1);
ESDWORD[shadow_buf_32] = WIN_SIZE_X;
ESDWORD[shadow_buf_32+4] = WIN_SIZE_Y;
loop()
{
WaitEventTimeout(delay);
switch(EAX & 0xFF)
{
case evButton:
Exit();
break;
case evReDraw:
DefineAndDrawWindow(WIN_X+1,WIN_Y,WIN_SIZE_X, WIN_SIZE_Y-1, 0x01, 0, 0, 0x01fffFFF);
DrawBar(WIN_SIZE_X,0, 1, WIN_SIZE_Y, 0x333333);
DefineButton(0,0, WIN_SIZE_X, WIN_SIZE_Y, 1+BT_HIDE+BT_NOFRAME, 0);
GetBackground();
break;
default:
Exit();
}
}
}
stop: