void BitBltAlpha(HDC hdcOut, int x, int y, int w, int h, HDC hdcIn, int xin, int yin, int mode, bool useAlphaChannel, float opacity) { HDC__ *in = (HDC__ *)hdcIn; HDC__ *out = (HDC__ *)hdcOut; if (!HDC_VALID(out) || !HDC_VALID(in)) return; if (!in->surface || !out->surface) return; LICE_Blit(out->surface,in->surface, x+out->surface_offs.x,y+out->surface_offs.y, xin+in->surface_offs.x,yin+in->surface_offs.y,w,h, opacity,LICE_BLIT_MODE_COPY|(useAlphaChannel?LICE_BLIT_USE_ALPHA:0)); swell_DirtyContext(out,x,y,x+w,y+h); }
void StretchBlt(HDC hdcOut, int x, int y, int w, int h, HDC hdcIn, int xin, int yin, int srcw, int srch, int mode) { HDC__ *in = (HDC__ *)hdcIn; HDC__ *out = (HDC__ *)hdcOut; if (!HDC_VALID(out) || !HDC_VALID(in)) return; if (!in->surface || !out->surface) return; LICE_ScaledBlit(out->surface,in->surface, x+out->surface_offs.x,y+out->surface_offs.y,w,h, xin+in->surface_offs.x,yin+in->surface_offs.y,srcw,srch, 1.0f,LICE_BLIT_MODE_COPY); swell_DirtyContext(out,x,y,x+w,y+h); }
HGDIOBJ SelectObject(HDC ctx, HGDIOBJ pen) { HDC__ *c=(HDC__ *)ctx; HGDIOBJ__ *p= pen; HGDIOBJ__ **mod=0; if (!HDC_VALID(c)||!p) return 0; if (p == (HGDIOBJ__ *)TYPE_PEN) mod=&c->curpen; else if (p == (HGDIOBJ__ *)TYPE_BRUSH) mod=&c->curbrush; else if (p == (HGDIOBJ__ *)TYPE_FONT) mod=&c->curfont; if (mod) { HGDIOBJ__ *np=*mod; *mod=0; return np?np:p; } if (!HGDIOBJ_VALID(p)) return 0; if (p->type == TYPE_PEN) mod=&c->curpen; else if (p->type == TYPE_BRUSH) mod=&c->curbrush; else if (p->type == TYPE_FONT) mod=&c->curfont; else return 0; HGDIOBJ__ *op=*mod; if (!op) op=(HGDIOBJ__ *)p->type; if (op != p) { *mod=p; } return op; }
void Polygon(HDC ctx, POINT *pts, int npts) { HDC__ *c=(HDC__ *)ctx; if (!HDC_VALID(c)) return; if (((!HGDIOBJ_VALID(c->curbrush,TYPE_BRUSH)||c->curbrush->wid<0) && (!HGDIOBJ_VALID(c->curpen,TYPE_PEN)||c->curpen->wid<0)) || npts<2) return; // CGContextBeginPath(c->ctx); // CGContextMoveToPoint(c->ctx,(float)pts[0].x,(float)pts[0].y); int x; for (x = 1; x < npts; x ++) { // CGContextAddLineToPoint(c->ctx,(float)pts[x].x,(float)pts[x].y); } if (HGDIOBJ_VALID(c->curbrush,TYPE_BRUSH) && c->curbrush->wid >= 0) { // CGContextSetFillColorWithColor(c->ctx,c->curbrush->color); } if (HGDIOBJ_VALID(c->curpen,TYPE_PEN) && c->curpen->wid>=0) { // CGContextSetLineWidth(c->ctx,(float)wdl_max(c->curpen->wid,1)); // CGContextSetStrokeColorWithColor(c->ctx,c->curpen->color); } // CGContextDrawPath(c->ctx,c->curpen && c->curpen->wid>=0 && c->curbrush && c->curbrush->wid>=0 ? kCGPathFillStroke : c->curpen && c->curpen->wid>=0 ? kCGPathStroke : kCGPathFill); }
void ReleaseDC(HWND h, HDC hdc) { if (!h || !HDC_VALID(hdc)) return; swell_gdpLocalContext *p = (swell_gdpLocalContext*)hdc; if (!h->m_paintctx) { // handle blitting? HWND par = h; while (par && !par->m_backingstore) par=par->m_parent; void swell_OSupdateWindowToScreen(HWND hwnd, RECT *rect); if (par) { if (p->ctx.dirty_rect_valid) { RECT r = p->clipr, dr=p->ctx.dirty_rect; dr.left += r.left; dr.top += r.top; dr.right += r.left; dr.bottom += r.top; #if 1 if (dr.left > r.left) r.left=dr.left; if (dr.top > r.top) r.top=dr.top; if (dr.right < r.right) r.right=dr.right; if (dr.bottom < r.bottom) r.bottom=dr.bottom; #endif if (r.top<r.bottom && r.left<r.right) swell_OSupdateWindowToScreen(par,&r); } } } delete p->ctx.surface; SWELL_GDP_CTX_DELETE(hdc); }
void PolyPolyline(HDC ctx, POINT *pts, DWORD *cnts, int nseg) { HDC__ *c=(HDC__ *)ctx; if (!HDC_VALID(c)||!HGDIOBJ_VALID(c->curpen,TYPE_PEN)||c->curpen->wid<0||nseg<1) return; // CGContextSetLineWidth(c->ctx,(float)wdl_max(c->curpen->wid,1)); // CGContextSetStrokeColorWithColor(c->ctx,c->curpen->color); // CGContextBeginPath(c->ctx); while (nseg-->0) { DWORD cnt=*cnts++; if (!cnt) continue; if (!--cnt) { pts++; continue; } // CGContextMoveToPoint(c->ctx,(float)pts->x,(float)pts->y); pts++; while (cnt--) { // CGContextAddLineToPoint(c->ctx,(float)pts->x,(float)pts->y); pts++; } } // CGContextStrokePath(c->ctx); }
void SWELL_LineTo(HDC ctx, int x, int y) { HDC__ *c=(HDC__ *)ctx; if (!HDC_VALID(c)||!HGDIOBJ_VALID(c->curpen,TYPE_PEN)||c->curpen->wid<0) return; // CGContextSetLineWidth(c->ctx,(float)wdl_max(c->curpen->wid,1)); // CGContextSetStrokeColorWithColor(c->ctx,c->curpen->color); // CGContextBeginPath(c->ctx); // CGContextMoveToPoint(c->ctx,c->lastpos_x,c->lastpos_y); float fx=(float)x,fy=(float)y; int dx=c->surface_offs.x; int dy=c->surface_offs.y; int lx = (int)c->lastpos_x, ly = (int) c->lastpos_y; LICE_Line(c->surface,x+dx,y+dy,lx+dx,ly+dy,c->curpen->color,c->curpen->alpha,LICE_BLIT_MODE_COPY,false); // CGContextAddLineToPoint(c->ctx,fx,fy); c->lastpos_x=fx; c->lastpos_y=fy; if (lx<x) { int a=x; x=lx; lx=a; } if (ly<y) { int a=y; y=ly; ly=a; } swell_DirtyContext(ctx, x-1,y-1,lx+1,ly+1); // CGContextStrokePath(c->ctx); }
void SetTextColor(HDC ctx, int col) { HDC__ *ct=(HDC__ *)ctx; if (!HDC_VALID(ct)) return; ct->cur_text_color_int = LICE_RGBA_FROMNATIVE(col,255); }
void SetTextColor(HDC ctx, int col) { HDC__ *ct=(HDC__ *)ctx; if (!HDC_VALID(ct)) return; ct->cur_text_color_int = col; }
BOOL GetTextMetrics(HDC ctx, TEXTMETRIC *tm) { HDC__ *ct=(HDC__ *)ctx; if (tm) // give some sane defaults { tm->tmInternalLeading=0; tm->tmAscent=8; tm->tmDescent=0; tm->tmHeight=8; tm->tmAveCharWidth = 8; } if (!HDC_VALID(ct)||!tm) return 0; #ifdef SWELL_FREETYPE HGDIOBJ__ *font = HGDIOBJ_VALID(ct->curfont,TYPE_FONT) ? ct->curfont : SWELL_GetDefaultFont(); if (font && font->fontface) { FT_Face face=(FT_Face) font->fontface; tm->tmAscent = face->size->metrics.ascender/64; tm->tmDescent = face->size->metrics.descender/64; tm->tmHeight = face->size->metrics.height/64; tm->tmAveCharWidth = face->size->metrics.height / 96; tm->tmInternalLeading=0; } #endif return 1; }
void PolyBezierTo(HDC ctx, POINT *pts, int np) { HDC__ *c=(HDC__ *)ctx; if (!HDC_VALID(c)||!HGDIOBJ_VALID(c->curpen,TYPE_PEN)||c->curpen->wid<0||np<3) return; // CGContextSetLineWidth(c->ctx,(float)wdl_max(c->curpen->wid,1)); // CGContextSetStrokeColorWithColor(c->ctx,c->curpen->color); // CGContextBeginPath(c->ctx); // CGContextMoveToPoint(c->ctx,c->lastpos_x,c->lastpos_y); int x; float xp,yp; for (x = 0; x < np-2; x += 3) { /* CGContextAddCurveToPoint(c->ctx, (float)pts[x].x,(float)pts[x].y, (float)pts[x+1].x,(float)pts[x+1].y, */ xp=(float)pts[x+2].x; yp=(float)pts[x+2].y; } c->lastpos_x=(float)xp; c->lastpos_y=(float)yp; // CGContextStrokePath(c->ctx); }
void SWELL_DeleteGfxContext(HDC ctx) { HDC__ *ct=(HDC__ *)ctx; if (HDC_VALID(ct)) { delete ct->surface; ct->surface=0; SWELL_GDP_CTX_DELETE(ct); } }
void SWELL_FillRect(HDC ctx, const RECT *r, HBRUSH br) { HDC__ *c=(HDC__ *)ctx; HGDIOBJ__ *b=(HGDIOBJ__ *) br; if (!HDC_VALID(c) || !HGDIOBJ_VALID(b,TYPE_BRUSH)) return; if (b->wid<0) return; }
void SWELL_DeleteGfxContext(HDC ctx) { HDC__ *ct=(HDC__ *)ctx; if (HDC_VALID(ct)) { if (ct->ownedData) { free(ct->ownedData); } SWELL_GDP_CTX_DELETE(ct); } }
void SWELL_SetPixel(HDC ctx, int x, int y, int c) { HDC__ *ct=(HDC__ *)ctx; if (!HDC_VALID(ct)) return; /* CGContextBeginPath(ct->ctx); CGContextMoveToPoint(ct->ctx,(float)x,(float)y); CGContextAddLineToPoint(ct->ctx,(float)x+0.5,(float)y+0.5); CGContextSetLineWidth(ct->ctx,(float)1.5); CGContextSetRGBStrokeColor(ct->ctx,GetRValue(c)/255.0,GetGValue(c)/255.0,GetBValue(c)/255.0,1.0); CGContextStrokePath(ct->ctx); */ }
void MoveToEx(HDC ctx, int x, int y, POINT *op) { HDC__ *c=(HDC__ *)ctx; if (!HDC_VALID(c)) return; if (op) { op->x = (int) (c->lastpos_x); op->y = (int) (c->lastpos_y); } c->lastpos_x=(float)x; c->lastpos_y=(float)y; }
int DrawText(HDC ctx, const char *buf, int buflen, RECT *r, int align) { HDC__ *ct=(HDC__ *)ctx; if (!HDC_VALID(ct)) return 0; if (r && (align&DT_CALCRECT)) { r->top=r->left=0; r->bottom=10; r->right = ( buflen < 0 ? strlen(buf) : buflen ) *8; } else printf("DrawText: %s\n",buf); return 10; }
void SWELL_FillRect(HDC ctx, const RECT *r, HBRUSH br) { HDC__ *c=(HDC__ *)ctx; HGDIOBJ__ *b=(HGDIOBJ__ *) br; if (!HDC_VALID(c) || !HGDIOBJ_VALID(b,TYPE_BRUSH)) return; if (!c->surface) return; if (b->wid<0) return; LICE_FillRect(c->surface, r->left+c->surface_offs.x, r->top+c->surface_offs.y, r->right-r->left,r->bottom-r->top,b->color,b->alpha,LICE_BLIT_MODE_COPY); swell_DirtyContext(ctx,r->left,r->top,r->right,r->bottom); }
void Rectangle(HDC ctx, int l, int t, int r, int b) { HDC__ *c=(HDC__ *)ctx; if (!HDC_VALID(c)) return; //CGRect rect=CGRectMake(l,t,r-l,b-t); if (HGDIOBJ_VALID(c->curbrush,TYPE_BRUSH) && c->curbrush->wid >= 0) { } if (HGDIOBJ_VALID(c->curpen,TYPE_PEN) && c->curpen->wid >= 0) { } }
BOOL GetTextMetrics(HDC ctx, TEXTMETRIC *tm) { HDC__ *ct=(HDC__ *)ctx; if (tm) // give some sane defaults { tm->tmInternalLeading=3; tm->tmAscent=12; tm->tmDescent=4; tm->tmHeight=16; tm->tmAveCharWidth = 10; } if (!HDC_VALID(ct)||!tm) return 0; return 1; }
void SWELL_LineTo(HDC ctx, int x, int y) { HDC__ *c=(HDC__ *)ctx; if (!HDC_VALID(c)||!HGDIOBJ_VALID(c->curpen,TYPE_PEN)||c->curpen->wid<0) return; // CGContextSetLineWidth(c->ctx,(float)wdl_max(c->curpen->wid,1)); // CGContextSetStrokeColorWithColor(c->ctx,c->curpen->color); // CGContextBeginPath(c->ctx); // CGContextMoveToPoint(c->ctx,c->lastpos_x,c->lastpos_y); float fx=(float)x,fy=(float)y; // CGContextAddLineToPoint(c->ctx,fx,fy); c->lastpos_x=fx; c->lastpos_y=fy; // CGContextStrokePath(c->ctx); }
HGDIOBJ SelectObject(HDC ctx, HGDIOBJ pen) { HDC__ *c=(HDC__ *)ctx; HGDIOBJ__ *p=(HGDIOBJ__ *) pen; HGDIOBJ__ **mod=0; if (!HDC_VALID(c)||!p) return 0; if (p == (HGDIOBJ__ *)TYPE_PEN) mod=&c->curpen; else if (p == (HGDIOBJ__ *)TYPE_BRUSH) mod=&c->curbrush; else if (p == (HGDIOBJ__ *)TYPE_FONT) mod=&c->curfont; if (mod) { HGDIOBJ__ *np=*mod; *mod=0; return np?np:p; } if (!HGDIOBJ_VALID(p)) return 0; if (p->type == TYPE_PEN) mod=&c->curpen; else if (p->type == TYPE_BRUSH) mod=&c->curbrush; else if (p->type == TYPE_FONT) mod=&c->curfont; else return 0; HGDIOBJ__ *op=*mod; if (!op) op=(HGDIOBJ__ *)p->type; if (op != p) { *mod=p; if (p->type == TYPE_FONT) { // CGContextSelectFont(c->ctx,p->fontface,(float)p->wid,kCGEncodingMacRoman); } } return op; }
void Rectangle(HDC ctx, int l, int t, int r, int b) { HDC__ *c=(HDC__ *)ctx; if (!HDC_VALID(c)) return; //CGRect rect=CGRectMake(l,t,r-l,b-t); swell_DirtyContext(ctx,l,t,r,b); l += c->surface_offs.x; t += c->surface_offs.y; r += c->surface_offs.x; b += c->surface_offs.y; if (HGDIOBJ_VALID(c->curbrush,TYPE_BRUSH) && c->curbrush->wid >= 0) { LICE_FillRect(c->surface,l,t,r-l,b-t,c->curbrush->color,c->curbrush->alpha,LICE_BLIT_MODE_COPY); } if (HGDIOBJ_VALID(c->curpen,TYPE_PEN) && c->curpen->wid >= 0) { LICE_DrawRect(c->surface,l,t,r-l,b-t,c->curpen->color,c->curpen->alpha,LICE_BLIT_MODE_COPY); } }
void *SWELL_GetCtxFrameBuffer(HDC ctx) { HDC__ *ct=(HDC__ *)ctx; if (HDC_VALID(ct)) return ct->ownedData; return 0; }
int DrawText(HDC ctx, const char *buf, int buflen, RECT *r, int align) { const char *obuf=buf; HDC__ *ct=(HDC__ *)ctx; if (!r) return 0; int lineh = 8; int charw = 8; HGDIOBJ__ *font = NULL; #ifdef SWELL_FREETYPE int ascent=0; font = HDC_VALID(ct) && HGDIOBJ_VALID(ct->curfont,TYPE_FONT) ? ct->curfont : SWELL_GetDefaultFont(); FT_Face face = NULL; if (font && font->fontface) { face=(FT_Face)font->fontface; lineh = face->size->metrics.height/64; ascent = face->size->metrics.ascender/64; charw = face->size->metrics.max_advance/64; } #endif if (align&DT_CALCRECT) { if (!font && (align&DT_SINGLELINE)) { r->right = r->left + ( buflen < 0 ? strlen(buf) : buflen ) * charw; int h = r->right ? lineh:0; r->bottom = r->top+h; return h; } int xpos=0; int ypos=0; r->bottom=r->top; bool in_prefix=false; while (buflen && *buf) // if buflen<0, go forever { unsigned short c=0; int charlen = utf8char(buf,&c); buf+=charlen; if (buflen > 0) { buflen -= charlen; if (buflen < 0) buflen=0; } if (!c) break; if (c=='&' && !in_prefix && !(align&DT_NOPREFIX)) { in_prefix = true; continue; } in_prefix=false; if (c == '\n') { ypos += lineh; xpos=0; } else if (c != '\r') { if (font) { #ifdef SWELL_FREETYPE if (!FT_Load_Char(face, c, FT_LOAD_DEFAULT) && face->glyph) { // measure character FT_GlyphSlot g = face->glyph; int rext = xpos + (g->metrics.width + g->metrics.horiBearingX)/64; if (rext<=xpos) rext=xpos + g->metrics.horiAdvance/64; if (r->left+rext > r->right) r->right = r->left+rext; xpos += g->metrics.horiAdvance/64; int bext = r->top + ypos + lineh; // ascent + (g->metrics.height - g->metrics.horiBearingY)/64; if (bext > r->bottom) r->bottom = bext; continue; } } #endif xpos += c=='\t' ? charw*5 : charw; if (r->top + ypos + lineh > r->bottom) r->bottom = r->top+ypos+lineh; if (r->left+xpos>r->right) r->right=r->left+xpos; } } return r->bottom-r->top; } if (!HDC_VALID(ct)) return 0; RECT use_r = *r; use_r.left += ct->surface_offs.x; use_r.right += ct->surface_offs.x; use_r.top += ct->surface_offs.y; use_r.bottom += ct->surface_offs.y; int xpos = use_r.left; int ypos = use_r.top; if (align&(DT_CENTER|DT_VCENTER|DT_RIGHT|DT_BOTTOM)) { RECT tr={0,}; DrawText(ctx,buf,buflen,&tr,align|DT_CALCRECT); if (align&DT_CENTER) xpos -= ((tr.right-tr.left) - (use_r.right-use_r.left))/2; else if (align&DT_RIGHT) xpos = use_r.right - (tr.right-tr.left); if (align&DT_VCENTER) ypos -= ((tr.bottom-tr.top) - (use_r.bottom-use_r.top))/2; else if (align&DT_BOTTOM) ypos = use_r.bottom - (tr.bottom-tr.top); } LICE_IBitmap *surface = ct->surface; int fgcol = ct->cur_text_color_int; int bgcol = ct->curbkcol; int bgmode = ct->curbkmode; int clip_x1=wdl_max(use_r.left,0), clip_y1 = wdl_max(use_r.top,0); int clip_w=0, clip_h=0; if (surface) { clip_w = wdl_min(use_r.right,surface->getWidth())-clip_x1; clip_h = wdl_min(use_r.bottom,surface->getHeight())-clip_y1; if (clip_w<0)clip_w=0; if (clip_h<0)clip_h=0; } LICE_SubBitmap clipbm(surface,clip_x1,clip_y1,clip_w,clip_h); if (surface && !(align&DT_NOCLIP)) { surface = &clipbm; xpos-=clip_x1; ypos-=clip_y1; } int left_xpos = xpos,ysize=0,max_xpos=0; int start_ypos = ypos; bool in_prefix=false; while (buflen && *buf) { unsigned short c=0; int charlen = utf8char(buf,&c); if (buflen>0) { buflen -= charlen; if (buflen<0) buflen=0; } buf+=charlen; bool doUl=in_prefix; if (c=='&' && !in_prefix && !(align&DT_NOPREFIX)) { in_prefix = true; continue; } in_prefix=false; if (c=='\n' && !(align&DT_SINGLELINE)) { xpos=left_xpos; ypos+=lineh; } else if (c=='\r') {} else { bool needr=true; if (font) { #ifdef SWELL_FREETYPE if (!FT_Load_Char(face, c, FT_LOAD_RENDER) && face->glyph) { FT_GlyphSlot g = face->glyph; if (bgmode==OPAQUE) LICE_FillRect(surface,xpos,ypos,g->metrics.horiAdvance/64,lineh,bgcol,1.0f,LICE_BLIT_MODE_COPY); LICE_DrawGlyphEx(surface,xpos+g->bitmap_left,ypos+ascent-g->bitmap_top,fgcol,(LICE_pixel_chan *)g->bitmap.buffer,g->bitmap.width,g->bitmap.pitch,g->bitmap.rows,1.0f,LICE_BLIT_MODE_COPY); int rext = xpos + (g->metrics.width + g->metrics.horiBearingX)/64; if (rext<=xpos) rext=xpos + g->metrics.horiAdvance/64; if (rext > max_xpos) max_xpos=rext; xpos += g->metrics.horiAdvance/64; int bext = ypos + lineh; // + (g->metrics.height - g->metrics.horiBearingY)/64; if (ysize < bext) ysize=bext; needr=false; } #endif } if (needr) { if (c=='\t') { if (bgmode==OPAQUE) LICE_FillRect(surface,xpos,ypos,charw*5,lineh,bgcol,1.0f,LICE_BLIT_MODE_COPY); xpos+=charw*5; if (ysize < ypos+lineh) ysize=ypos+lineh; } else { if (bgmode==OPAQUE) LICE_FillRect(surface,xpos,ypos,charw,lineh,bgcol,1.0f,LICE_BLIT_MODE_COPY); LICE_DrawChar(surface,xpos,ypos,c,fgcol,1.0f,LICE_BLIT_MODE_COPY); if (doUl) LICE_Line(surface,xpos,ypos+lineh+1,xpos+charw,ypos+lineh+1,fgcol,1.0f,LICE_BLIT_MODE_COPY,false); if (ysize < ypos+lineh+(doUl ? 2:1)) ysize=ypos+lineh+(doUl ? 2:1); xpos+=charw; } } } if(xpos>max_xpos)max_xpos=xpos; } if (surface==&clipbm) swell_DirtyContext(ct,clip_x1+left_xpos,clip_y1+start_ypos,clip_x1+max_xpos,clip_y1+start_ypos+ysize); else swell_DirtyContext(ct,left_xpos,start_ypos,max_xpos,start_ypos+ysize); return ysize; }
int GetTextColor(HDC ctx) { HDC__ *ct=(HDC__ *)ctx; if (!HDC_VALID(ct)) return -1; return ct->cur_text_color_int; }
void SetBkMode(HDC ctx, int col) { HDC__ *ct=(HDC__ *)ctx; if (!HDC_VALID(ct)) return; ct->curbkmode=col; }
void SetBkColor(HDC ctx, int col) { HDC__ *ct=(HDC__ *)ctx; if (!HDC_VALID(ct)) return; ct->curbkcol=col; }
void *SWELL_GetCtxGC(HDC ctx) { HDC__ *ct=(HDC__ *)ctx; if (!HDC_VALID(ct)) return 0; return NULL; }
void SetBkColor(HDC ctx, int col) { HDC__ *ct=(HDC__ *)ctx; if (!HDC_VALID(ct)) return; ct->curbkcol=LICE_RGBA_FROMNATIVE(col,255); }