| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 | #include <tataki/canvas/bltcanvas.h>inline float QuartzBlue(RGB32 color){  unsigned char *pixel = (unsigned char *)&color;  return pixel[0] / 255.f;}inline float QuartzGreen(RGB32 color){  unsigned char *pixel = (unsigned char *)&color;  return pixel[1] / 255.f;}inline float QuartzRed(RGB32 color){  unsigned char *pixel = (unsigned char *)&color;  return pixel[2] / 255.f;}inline float QuartzAlpha(RGB32 color){  unsigned char *pixel = (unsigned char *)&color;  return pixel[3] / 255.f;}BltCanvas::BltCanvas(int width, int height, OSWINDOWHANDLE wnd){  CGrafPtr qdcontext = GetWindowPort(wnd);  CGContextRef temp;  QDBeginCGContext(qdcontext, &temp);  CGSize size = CGSizeMake(width, height);  layer = CGLayerCreateWithContext(temp, size, NULL);  context = CGLayerGetContext(layer);  QDEndCGContext(qdcontext, &temp);}void BltCanvas::blit(int srcx, int srcy, Canvas *dest, int dstx, int dsty, int dstw, int dsth){  CGPoint point = CGPointMake(dstx-srcx, dsty-srcy);  CGContextDrawLayerAtPoint(dest->getHDC(), point, layer);}void BltCanvas::blitToRect(ifc_canvas *canvas, RECT *src, RECT *dst, int alpha){  CGContextRef dest = canvas->getHDC();  CGContextSaveGState(dest);  CGContextSetAlpha(dest, (float)alpha/255.f);  // TODO: deal with width properly   CGRect rect = CGRectMake(dst->left - src->left, dst->top - src->top, dst->right - dst->left, dst->bottom - dst->top);  CGContextDrawLayerInRect(dest, rect, layer);  CGContextRestoreGState(dest);}void BltCanvas::stretchblit(int srcx, int srcy, int srcw, int srch, Canvas *dest, int dstx, int dsty, int dstw, int dsth){  CGContextSaveGState(context);  CGContextTranslateCTM(context, srcx, srcy);  CGRect rect = CGRectMake(dstx, dsty, dstw, dsth);  CGContextDrawLayerInRect(dest->getHDC(), rect, layer);  CGContextRestoreGState(context);}void BltCanvas::stretchToRectAlpha(ifc_canvas *canvas, RECT *src, RECT *dst, int alpha){  CGContextRef dest = canvas->getHDC();  CGContextSaveGState(dest);  CGContextSetAlpha(dest, (float)alpha/255.f);// TODO: deal with width properly   CGRect rect = CGRectMake(dst->left - src->left, dst->top - src->top, dst->right - dst->left, dst->bottom - dst->top);  CGContextDrawLayerInRect(dest, rect, layer);  CGContextRestoreGState(dest);}void BltCanvas::DestructiveResize(int w, int h, int nb_bpp){  CGSize size = CGSizeMake(w, h);  CGLayerRef newlayer = CGLayerCreateWithContext(context, size, NULL);  CGContextRelease(context);  CGLayerRelease(layer);  layer = newlayer;  context = CGLayerGetContext(layer);}void BltCanvas::fillBits(ARGB32 color){  CGContextSetRGBFillColor(context,                            QuartzRed(color), // red                           QuartzGreen(color), // green                           QuartzBlue(color), // blue                           QuartzAlpha(color) // alpha                           );    CGContextFillRect(context, CGRectInfinite);}
 |