static PyObject* osl_setDrawBuffer(PyObject *self, PyObject *args, PyObject *kwargs) { PyObject* buffer; if (!PyArg_ParseTuple(args, "O:setDrawBuffer"), &buffer) return NULL; if (PyInt_Check(buffer)) { oslSetDrawBuffer((OSL_IMAGE*)PyInt_AsLong(buffer)); } else if (PyType_IsSubtype(buffer->ob_type, PPyImageType)) { if (currentDrawBuffer) { Py_DECREF(currentDrawBuffer); } oslSetDrawBuffer(((PyImage*)buffer)->pImg); Py_INCREF(buffer); currentDrawBuffer = buffer; } else { PyErr_SetString(PyExc_TypeError, "Argument must be an osl.Image or predefined constant"); return NULL; } Py_INCREF(Py_None); return Py_None; }
void Buffer::createFromDrawable(Drawable &obj) { shouldDelete = true; if (obj.getW() > 512 || obj.getH() > 512) throw RubyException(rb_eRuntimeError, "Drawable too big for a buffer."); int width = obj.getW(); int height = obj.getH(); img = oslCreateImage(width, height, OSL_IN_VRAM, OSL_PF_8888); if (!img) { img = oslCreateImage(width, height, OSL_IN_RAM, OSL_PF_8888); if (!img) throw RubyException(rb_eRuntimeError, "Buffer could not be created"); } else { Buffer::registerInVram(img); } OSL_IMAGE *old = oslGetDrawBuffer(); setActual(); obj.clearMove(); obj.setPos(0, 0); obj.draw(); obj.cancelMove(); oslSetDrawBuffer(old); }
void Buffer::resize(int w, int h) { if (!shouldDelete) throw RubyException(rb_eRuntimeError, "Not allowed to resize this Buffer"); OSL_IMAGE *old_image = img; OSL_IMAGE *old_buffer = oslGetDrawBuffer(); img = oslCreateImage(w, h, OSL_IN_VRAM, img->pixelFormat); if (!img) { img = oslCreateImage(w, h, OSL_IN_RAM, img->pixelFormat); if (!img) throw RubyException(rb_eRuntimeError, "Could not recreate the buffer."); } else { Buffer::registerInVram(img); } setActual(); oslDrawImageXY(old_image, 0, 0); oslSetDrawBuffer(old_buffer); if (old_image->location == OSL_IN_RAM) oslDeleteImage(old_image); else Buffer::removeFromVram(old_image); }
void Buffer::resize(int w, int h) { OSL_IMAGE *old_image = img; OSL_IMAGE *old_buffer = oslGetDrawBuffer(); img = oslCreateImage(w, h, OSL_IN_VRAM, img->pixelFormat); if (!img) throw RubyException(rb_eRuntimeError, "Could not recreate the buffer."); setActual(); oslDrawImageXY(old_image, 0, 0); oslSetDrawBuffer(old_buffer); oslDeleteImage(old_image); }
Buffer::Buffer(Drawable &obj): shouldDelete(true) { setClass("Buffer"); if (obj.getW() > 512 || obj.getH() > 512) throw RubyException(rb_eRuntimeError, "Drawable too big for a buffer."); img = oslCreateImage(obj.getW(), obj.getH(), OSL_IN_VRAM, OSL_PF_8888); if (!img) throw RubyException(rb_eRuntimeError, "Buffer could not be created"); OSL_IMAGE *old = oslGetDrawBuffer(); setActual(); obj.clearMove(); obj.setPos(0, 0); obj.draw(); obj.cancelMove(); oslSetDrawBuffer(old); }
/* call-seq: draw(hash = nil) { ... } Three keys are checked in the given hash : ":buffer" which is the buffer on which manipulation are done (by default, the actual buffer is taken), ":painter", which tell us to yield a +Joyau::Painter+ instead of a +Joyau::Buffer+ when true (false by default), and ":auto_update" which tell us whether we should update the buffer (true by default). It is mandatory to give a block to this function. Examples: Joyau.draw(:buffer => a_buffer, :painter => true) Joyau.draw(:auto_update => false) Joyau.draw(:painter => true) Joyau.draw(:buffer => a_buffer) */ VALUE Joyau_draw(int argc, VALUE *argv, VALUE self) { static bool can_draw = false; VALUE hash, block; rb_scan_args(argc, argv, "01&", &hash, &block); OSL_IMAGE *oldBuffer = oslGetDrawBuffer(); Buffer *buffer = NULL; VALUE rbPainter = Qnil; bool painter = false; bool auto_update = true; bool ruby_buf = false; bool could_draw = can_draw; if (!NIL_P(hash)) { if (TYPE(hash) != T_HASH) rb_raise(rb_eTypeError, "Hash expected for Joyau::draw."); VALUE rbBuffer = rb_hash_aref(hash, ID2SYM(rb_intern("buffer"))); if (rb_obj_is_kind_of(rbBuffer, getClass("Buffer")) == Qfalse) { if (rbBuffer != Qnil) rb_raise(rb_eTypeError, ":buffer should be a Buffer (or nil)."); } else { buffer = getPtr<Buffer>(rbBuffer); ruby_buf = true; } if (!buffer) buffer = new Buffer(oldBuffer); if (rb_hash_aref(hash, ID2SYM(rb_intern("painter"))) == Qtrue) { painter = true; Painter painter(buffer); rbPainter = createObject(getClass("Painter"), painter); } if (rb_hash_aref(hash, ID2SYM(rb_intern("auto_update"))) == Qfalse) auto_update = false; } else { if (!buffer) buffer = new Buffer(oldBuffer); } if (buffer->isScreen() && !can_draw) { can_draw = true; Graphics_startDraw(Qnil); } if (!NIL_P(block)) { buffer->setActual(); if (painter) rb_yield(rbPainter); else { VALUE rbBuffer = createObject(getClass("Buffer"), *buffer, true); rb_yield(rbBuffer); } if (buffer->isScreen() && !could_draw) { can_draw = false; Graphics_endDraw(Qnil); } if (auto_update && buffer->isScreen()) Graphics_sync(Qnil); } else rb_raise(rb_eArgError, "Block expected."); if (!ruby_buf) // We do not delete the buffer if it comes from Ruby. delete buffer; oslSetDrawBuffer(oldBuffer); return Qnil; }
void Buffer::draw(Buffer &obj) { OSL_IMAGE *old = oslGetDrawBuffer(); setActual(); obj.draw(); oslSetDrawBuffer(old); }
void Buffer::setActual() { oslSetDrawBuffer(img); }
/* Affiche le logo OSLib Ne cherchez pas à comprendre cette fonction si vous débutez :p */ int oslShowSplashScreen1() { OSL_IMAGE *texte, *etoile; OSL_IMAGE *fond; int skip=0; int x, y; int angle, nFrame, val; float dist; int pousNb; float pousX[100], pousY[100]; int i, imgAngle; float tblVitPous[8] = {0.2, 0.3, 0.15, 0.2, 0.35, 0.2, 0.15, 0.3}; int fade = 0; //Add these files to the list oslAddVirtualFileList((OSL_VIRTUALFILENAME*)__osl_logo_ram_files, oslNumberof(__osl_logo_ram_files)); texte = oslLoadImageFile("ram:/logo/texte.png", OSL_IN_VRAM | OSL_UNSWIZZLED, OSL_PF_8888); if (!texte) return 0; logoDecalePixels(texte); oslStartDrawing(); oslSetDithering(1); oslSetDrawBuffer(texte); oslDrawGradientRect(0,0, WIDTH,HEIGHT, RGB(0,0,0), RGB(0,0,128), RGB(0,0,128), RGB(0,0,0)); oslSetDrawBuffer(OSL_DEFAULT_BUFFER); oslEndDrawing(); oslMoveImageTo(texte, OSL_IN_RAM); oslSwizzleImage(texte); fond = logoCreeImageFond(); if (!fond) { oslDeleteImage(texte); return 0; } oslSetTransparentColor(RGB(255,0,254)); etoile = oslLoadImageFile("ram:/logo/etoile.png", OSL_IN_RAM, OSL_PF_5551); if (!etoile) { oslDeleteImage(texte); oslDeleteImage(fond); return 0; } oslDisableTransparentColor(); texte->centerX = texte->sizeX / 2; texte->centerY = texte->sizeY / 2; angle = 270; dist = 160.0f; nFrame = 0; pousNb=0; imgAngle = 78; while (!osl_quit) { if (!skip) { oslStartDrawing(); logoCreePaletteRotative(fond, 2000-nFrame*8); oslDrawImage(fond); x = WIDTH/2; y = HEIGHT/2; if (dist > 0) { x += oslCos(angle, dist); y -= oslSin(angle, dist); texte->stretchX = texte->sizeX * (1+dist*0.03f); texte->stretchY = texte->sizeY * (1+dist*0.03f); texte->angle = imgAngle; } else { texte->stretchX = texte->sizeX; texte->stretchY = texte->sizeY; texte->angle = 0; } oslSetBilinearFilter(1); //Effet spécial pour le texturage des nuages if (nFrame >= 50) { val = (nFrame - 50) * 6; if (val > 255) val = 255; oslSetAlpha(OSL_FX_ALPHA|OSL_FX_COLOR, RGBA(val,val,val,0xff)); } else oslSetAlpha(OSL_FX_ALPHA|OSL_FX_COLOR, RGBA(0,0,0,0xff)); oslDrawImageXY(texte, x, y); oslSetImageTileSize(etoile, 0,0, 16,16); oslCorrectImageHalfBorder(etoile); oslImageSetRotCenter(etoile); etoile->angle = 360 - ((nFrame * 3) % 360); etoile->stretchX = 16; etoile->stretchY = 16; oslSetAlpha(OSL_FX_ALPHA|OSL_FX_COLOR, RGBA(0xff,0,0,0xff)); oslDrawImageXY(etoile, 480-9, 272-9); //Dessine l'étoile if (nFrame >= 140 && nFrame < 240) { val = nFrame - 140; angle = (val * 5) % 360; i = nFrame - (240 - 256/12); if (val*16 < 255) oslSetAlpha(OSL_FX_ALPHA, val*16); else if (i > 0) oslSetAlpha(OSL_FX_ALPHA, 255-i*12); else oslSetAlpha(OSL_FX_RGBA, 0); etoile->angle = (val * 8) % 360; etoile->x = WIDTH/2 + oslCosi(angle, 120); etoile->y = HEIGHT/2 - oslSini(angle, 50); etoile->stretchX = 16 * 2; etoile->stretchY = 16 * 2; oslDrawImage(etoile); oslResetImageHalfBorder(etoile); } //Restaure l'environnement oslSetBilinearFilter(0); //Dessine les poussières oslSetAlpha(OSL_FX_ADD, 0xff); oslSetImageTileSize(etoile, 0,16, 8,8); oslImageSetRotCenter(etoile); for (i=0;i<pousNb;i++) oslDrawImageSimpleXY(etoile, pousX[i], pousY[i]); oslSetAlpha(OSL_FX_RGBA, 0); // oslSysBenchmarkDisplay(); //Fade if (nFrame < 32) oslDrawFillRect(0,0, WIDTH,HEIGHT, RGBA(0,0,0,255-(nFrame<<3))); if (fade > 0) { if (fade >= 31) fade = 31; oslDrawFillRect(0,0, WIDTH,HEIGHT, RGBA(0,0,0,(fade<<3))); } oslEndDrawing(); } nFrame++; //L'étoile tourne sur le logo if (nFrame >= 140 && nFrame < 240) { val = nFrame - 140; angle = (val * 5) % 360; if (angle >= 200 && angle <= 340) { pousX[pousNb] = WIDTH/2 + oslCos(angle, 120); pousY[pousNb] = HEIGHT/2 - oslSin(angle, 50); pousNb++; } } if (fade > 0) fade++; if (nFrame > 290 && fade == 0) fade = 1; for (i=0;i<pousNb;i++) { pousY[i] += tblVitPous[i%8]; } dist -= 2.0f; angle -= 4; imgAngle -= 1; if (angle < 0) angle += 360; skip = oslSyncFrameEx(1,4,0); //Lecture des touches oslReadKeys(); if ((osl_keys->pressed.value & (OSL_KEYMASK_START|OSL_KEYMASK_CIRCLE|OSL_KEYMASK_CROSS)) && fade == 0) fade = 1; if (fade >= 32) break; } oslSetAlpha(OSL_FX_RGBA, 0); oslDeleteImage(texte); oslDeleteImage(fond); oslDeleteImage(etoile); oslRemoveVirtualFileList((OSL_VIRTUALFILENAME*)__osl_logo_ram_files, oslNumberof(__osl_logo_ram_files)); return 1; }