8 #include <lib/gdi/grc.h>
9 #include <lib/gdi/font.h>
10 #include <lib/base/init.h>
11 #include <lib/base/init_num.h>
16 void *gRC::thread_wrapper(void *ptr)
19 return ((gRC*)ptr)->thread();
25 gRC::gRC(): queuelock(MAXSIZE), queue(2048)
29 queuelock.lock(MAXSIZE);
31 eDebug(pthread_create(&the_thread, 0, thread_wrapper, this)?"RC thread couldn't be created":"RC thread createted successfully");
39 o.opcode=gOpcode::shutdown;
53 gOpcode& o(queue.current());
54 if (o.opcode==gOpcode::shutdown)
65 gRC &gRC::getInstance()
70 static int gPainter_instances;
72 gPainter::gPainter(gDC &dc, eRect rect): dc(dc), rc(gRC::getInstance()), foregroundColor(0), backgroundColor(0)
75 rect=eRect(ePoint(0, 0), dc.getSize());
76 // ASSERT(!gPainter_instances);
87 void gPainter::begin(const eRect &rect)
92 o.opcode=gOpcode::begin;
93 o.parm.begin=new gOpcode::para::pbegin(rect);
94 // cliparea=std::stack<eRect, std::list<eRect> >();
95 cliparea=std::stack<eRect>();
97 setLogicalZero(cliparea.top().topLeft());
101 void gPainter::setBackgroundColor(const gColor &color)
103 backgroundColor=color;
106 void gPainter::setForegroundColor(const gColor &color)
108 foregroundColor=color;
111 void gPainter::setFont(const gFont &mfont)
116 void gPainter::renderText(const eRect &pos, const std::string &string, int flags)
119 area.moveBy(logicalZero.x(), logicalZero.y());
123 o.opcode=gOpcode::renderText;
124 o.parm.renderText=new gOpcode::para::prenderText(font, area, string, dc.getRGB(foregroundColor), dc.getRGB(backgroundColor));
129 void gPainter::renderPara(eTextPara ¶, ePoint offset)
133 o.opcode=gOpcode::renderPara;
134 o.parm.renderPara=new gOpcode::para::prenderPara(logicalZero+offset, para.grab(), dc.getRGB(foregroundColor), dc.getRGB(backgroundColor));
138 void gPainter::fill(const eRect &area)
142 o.opcode=gOpcode::fill;
144 a.moveBy(logicalZero.x(), logicalZero.y());
147 o.parm.fill=new gOpcode::para::pfill(a, foregroundColor);
151 void gPainter::clear()
155 o.opcode=gOpcode::fill;
156 o.parm.fill=new gOpcode::para::pfill(cliparea.top(), backgroundColor);
160 void gPainter::setPalette(gRGB *colors, int start, int len)
164 o.opcode=gOpcode::setPalette;
165 gPalette *p=new gPalette;
167 p->data=new gRGB[len];
168 memcpy(p->data, colors, len*sizeof(gRGB));
171 o.parm.setPalette=new gOpcode::para::psetPalette(p);
175 void gPainter::mergePalette(gPixmap *target)
179 o.opcode=gOpcode::mergePalette;
180 o.parm.mergePalette=new gOpcode::para::pmergePalette(target);
184 void gPainter::line(ePoint start, ePoint end)
188 o.opcode=gOpcode::line;
189 o.parm.line=new gOpcode::para::pline(start+logicalZero, end+logicalZero, foregroundColor);
193 void gPainter::setLogicalZero(ePoint rel)
198 void gPainter::moveLogicalZero(ePoint rel)
203 void gPainter::resetLogicalZero()
209 void gPainter::clip(eRect clip)
213 o.opcode=gOpcode::clip;
214 clip.moveBy(logicalZero.x(), logicalZero.y());
215 cliparea.push(cliparea.top()&clip);
216 o.parm.clip=new gOpcode::para::pclip(cliparea.top());
221 void gPainter::clippop()
223 ASSERT (cliparea.size()>1);
226 o.opcode=gOpcode::clip;
228 o.parm.clip=new gOpcode::para::pclip(cliparea.top());
232 void gPainter::flush()
236 o.opcode=gOpcode::flush;
244 o.opcode=gOpcode::end;
252 gPixmapDC::gPixmapDC(): pixmap(0)
256 gPixmapDC::gPixmapDC(gPixmap *pixmap): pixmap(pixmap)
260 gPixmapDC::~gPixmapDC()
265 void gPixmapDC::exec(gOpcode *o)
270 clip=o->parm.begin->area;
271 delete o->parm.begin;
273 case gOpcode::renderText:
275 eTextPara *para=new eTextPara(o->parm.renderText->area);
276 para->setFont(o->parm.renderText->font);
277 para->renderString(o->parm.renderText->text, o->flags);
278 para->blit(*this, ePoint(0, 0), o->parm.renderText->backgroundColor, o->parm.renderText->foregroundColor);
280 delete o->parm.renderText;
283 case gOpcode::renderPara:
285 o->parm.renderPara->textpara->blit(*this, o->parm.renderPara->offset, o->parm.renderPara->backgroundColor, o->parm.renderPara->foregroundColor);
286 o->parm.renderPara->textpara->destroy();
287 delete o->parm.renderPara;
291 pixmap->fill(o->parm.fill->area, o->parm.fill->color);
296 if (o->parm.blit->clip.isNull())
297 o->parm.blit->clip=clip;
299 o->parm.blit->clip&=clip;
300 pixmap->blit(*o->parm.blit->pixmap, o->parm.blit->position, o->parm.blit->clip, o->flags);
304 case gOpcode::setPalette:
305 if (o->parm.setPalette->palette->start>pixmap->clut.colors)
306 o->parm.setPalette->palette->start=pixmap->clut.colors;
307 if (o->parm.setPalette->palette->colors>(pixmap->clut.colors-o->parm.setPalette->palette->start))
308 o->parm.setPalette->palette->colors=pixmap->clut.colors-o->parm.setPalette->palette->start;
309 if (o->parm.setPalette->palette->colors)
310 memcpy(pixmap->clut.data+o->parm.setPalette->palette->start, o->parm.setPalette->palette->data, o->parm.setPalette->palette->colors*sizeof(gRGB));
311 delete[] o->parm.setPalette->palette->data;
312 delete o->parm.setPalette->palette;
313 delete o->parm.setPalette;
315 case gOpcode::mergePalette:
316 pixmap->mergePalette(*o->parm.blit->pixmap);
320 pixmap->line(o->parm.line->start, o->parm.line->end, o->parm.line->color);
324 clip=o->parm.clip->clip;
332 eFatal("illegal opcode %d. expect memory leak!", o->opcode);
336 gRGB gPixmapDC::getRGB(gColor col)
338 if ((!pixmap) || (!pixmap->clut.data))
339 return gRGB(col, col, col);
342 eFatal("bla transp");
343 return gRGB(0, 0, 0, 0xFF);
345 return pixmap->clut.data[col];
348 eAutoInitP0<gRC> init_grc(eAutoInitNumbers::graphic, "gRC");