| 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(api_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(api_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);
 
- }
 
 
  |