ultimatepp/uppdev/CDraw/base.cpp
cxl 351994a6cc Adding uppdev....
git-svn-id: svn://ultimatepp.org/upp/trunk@328 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2008-08-15 08:36:24 +00:00

245 lines
4.6 KiB
C++

#include "MDraw.h"
void DrawRectNOP(PixelBlock& w, int x, int y, int cx, int cy, Color c) {}
void DrawNOP(PixelBlock& w, int x, int y, Color c) {}
void DrawRectBASE(PixelBlock& w, int x, int y, int cx, int cy, Color c)
{
RTIMING("DrawRect");
Rect r = RectC(x, y, cx, cy);
r.Intersect(w.GetSize());
if(r.IsEmpty())
return;
dword color = c.GetRaw();
dword *a = w.PointAdr(r.left, r.top);
int d = w.LineDelta();
cy = r.Height();
cx = r.Width();
while(cy--) {
memsetd(a, color, cx);
a += d;
}
}
static const byte n_o[] = {
0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
0x00, 0xff, 0x00, 0x00, 0xff, 0x00,
0x00, 0xff, 0x00, 0x00, 0xff, 0x00,
0xff, 0x00, 0x00, 0x00, 0x00, 0xff,
0xff, 0x00, 0x00, 0x00, 0x00, 0xff,
0xff, 0x00, 0x00, 0x00, 0x00, 0xff,
0xff, 0x00, 0x00, 0x00, 0x00, 0xff,
0xff, 0x00, 0x00, 0x00, 0x00, 0xff,
0x00, 0xff, 0x00, 0x00, 0xff, 0x00,
0x00, 0xff, 0x00, 0x00, 0xff, 0x00,
0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
};
String of_packed;
void DrawBASE(PixelBlock& w, int x, int y, Color c)
{
if(!Rect(w.GetSize()).Contains(Rect(x, y, x + 6, y + 11)))
return;
dword *a = w.PointAdr(x, y);
int d = w.LineDelta();
dword ic = c;
const byte *s = of_packed;
dword *t = a;
for(;;) {
byte c = *s++;
if(c == 0)
break;
t += (c >> 3) & 15;
switch(c & 7) {
case 7:
t[6] = ic;
case 6:
t[5] = ic;
case 5:
t[4] = ic;
case 4:
t[3] = ic;
case 3:
t[2] = ic;
case 2:
t[1] = ic;
case 1:
t[0] = ic;
}
t += c & 7;
if(c & 0x80) {
a += d;
t = a;
}
}
}
INITBLOCK {
StringBuffer pk;
for(int w = 0; w < 11; w++) {
int n = 0;
const byte *ln = n_o + w * 6;
bool wasnot = true;
for(int q = 0; q < 6; q++)
if(ln[q]) {
int m = 0;
while(q < 6 && ln[q]) {
m++;
q++;
}
while(n > 15) {
pk.Cat((15 << 3));
n -= 15;
}
if(m > 7) {
pk.Cat((n << 3) | 7);
m -= 7;
while(m > 7) {
pk.Cat(7);
m -= 7;
}
if(m)
pk.Cat(m);
}
else
pk.Cat((n << 3) | m);
n = 1;
wasnot = false;
}
else
n++;
if(wasnot)
pk.Cat(0x80);
else
*(pk.End() - 1) |= 0x80;
}
pk.Cat(0);
of_packed = pk;
}
String op;
INITBLOCK {
static const byte o[] = {
// 0 1 2 3 4 5
0x00, 0x80, 0xff, 0xff, 0x80, 0x00,
0x00, 0xff, 0x10, 0x10, 0xff, 0x00,
0x80, 0x80, 0x00, 0x00, 0xff, 0x80,
0xb0, 0x70, 0x00, 0x00, 0x70, 0xb0,
0xe0, 0x30, 0x00, 0x00, 0x30, 0xe0,
0xff, 0x00, 0x00, 0x00, 0x00, 0xff,
0xe0, 0x30, 0x00, 0x00, 0x30, 0xe0,
0xb0, 0x70, 0x00, 0x00, 0x70, 0xb0,
0x80, 0x80, 0x00, 0x00, 0xff, 0x80,
0x00, 0xff, 0x10, 0x10, 0xff, 0x00,
0x00, 0x80, 0xff, 0xff, 0x80, 0x00,
};
const byte *s = o;
int cx = 6;
int cy = 11;
StringBuffer result;
for(int i = 0; i < cy; i++) {
int j = 0;
while(j < cx) {
if(*s == 0) {
int n = 0;
while(*s == 0 && j < cx) {
n++;
j++;
s++;
}
while(n >= 255) {
result.Cat(0);
result.Cat(254);
n -= 254;
}
result.Cat(0);
result.Cat(n);
}
else {
result.Cat(*s++);
j++;
}
}
result.Cat(0);
result.Cat(0);
}
result.Cat(0);
result.Cat(255);
op = result;
}
void AADrawBASE(PixelBlock& w, int x, int y, Color c)
{
if(!Rect(w.GetSize()).Contains(Rect(x, y, x + 6, y + 11)))
return;
const byte *s = op;
dword *a = w.PointAdr(x, y);
int d = w.LineDelta();
byte tr = c.GetR();
byte tg = c.GetG();
byte tb = c.GetB();
int q = 0;
for(;;) {
byte c = *s++;
if(c) {
byte *m = (byte *)&a[q];
int alpha = c + (c >> 7);
m[0] += alpha * (tr - m[0]) >> 8;
m[1] += alpha * (tg - m[1]) >> 8;
m[2] += alpha * (tb - m[2]) >> 8;
q++;
}
else {
c = *s++;
if(c)
q += c;
else {
if(s[0] == 0 && s[1] == 255)
return;
a += d;
q = 0;
}
}
}
a += d;
}
void AADrawBASEPF(PixelBlock& w, int x, int y, Color c)
{
if(!Rect(w.GetSize()).Contains(Rect(x, y, x + 6, y + 11)))
return;
const byte *s = op;
dword *a = w.PointAdr(x, y);
int d = w.LineDelta();
byte tr = c.GetR();
byte tg = c.GetG();
byte tb = c.GetB();
int q = 0;
dword *h = a;
for(;;) {
byte c = *s++;
if(c) {
byte *m = (byte *)&a[q];
int alpha = c + (c >> 7);
m[0] += alpha * (tr - m[0]) >> 8;
m[1] += alpha * (tg - m[1]) >> 8;
m[2] += alpha * (tb - m[2]) >> 8;
q++;
}
else {
c = *s++;
if(c)
q += c;
else {
if(s[0] == 0 && s[1] == 255)
return;
a += d;
q = 0;
}
}
}
a += d;
}