static void fill_routine(int n, double *px, double *py, int tnr) { PolyHandle poly; register int i; double x, y; int ix, iy; poly = OpenPoly(); for (i = 0; i < n; i++) { WC_to_NDC(px[i], py[i], tnr, x, y); seg_xform(&x, &y); NDC_to_DC(x, y, ix, iy); if (i == 0) MoveTo(ix, iy); else LineTo(ix, iy); } ClosePoly(); if (p->pat) FillPoly(poly, p->pat); else PaintPoly(poly); KillPoly(poly); }
void PF_FillPoly(PF_InData *in_data, PF_ContextH contextH, PolyHandle poly) { #ifdef AE_OS_WIN HDC hdc; HBRUSH Brush = GetStockObject(WHITE_BRUSH); PF_GET_CGRAF_DATA((*contextH)->cgrafptr, PF_CGrafData_HDC, &hdc); FillRgn(hdc, (HRGN)*poly, Brush); #else FillPoly(poly, &in_data->qd_globals->gray); #endif }
void DrawNoSectPolyRecursive (CMap *theMap, PolyObjectHdl MapPolyHdl, DrawSpecRecPtr drawSettings,Rect subRect) { long PointCount, PlotCount = 0, PointIndex; LongPoint MatrixPt; Point LastScrPt, ThisScrPt, FirstScrPt; LongPoint **RgnPtsHdl; PolyHandle PolyHdl = nil; //////////// Boolean alwaysIn123 = true; Boolean alwaysIn174 = true; Boolean alwaysIn456 = true; Boolean alwaysIn386 = true; Boolean canSkipDrawingPolygon = false; // 1 7 4 // 2 0 5 // 3 8 6 //////////////// PointCount = GetPolyPointCount (MapPolyHdl); RgnPtsHdl = GetPolyPointsHdl (MapPolyHdl); Boolean bDrawBlackAndWhite = (sharedPrinting && settings.printMode != COLORMODE); #define MAXNUMSEGMENTS 8000 // JLM, It seems the limit is 32K not 64K at the documentation says short thisSectionOfPlane,prevSectionOfPlane; Boolean canSkipThisPt,skippedAPt,offQuickDrawPlane=false; Point lastSkippedPt; Rect fuzzyRect = subRect; long lineWidth = 1, esiCode; long outsetPixels = 2*lineWidth+2; // needs to be wider that the line width //long penWidth = 3; long penWidth = 2; long halfPenWidth = 0; InsetRect(&fuzzyRect,-outsetPixels,-outsetPixels); if (RgnPtsHdl != nil) { // must clip to this rect in addtion to the original clip Rect clippingRect = subRect; RgnHandle saveClip = NewRgn(), addition = NewRgn() , newClip = NewRgn(); GetClip(saveClip); GetClip(newClip); RectRgn(addition, &clippingRect); SectRgn(newClip, addition, newClip); SetClip(newClip); if(newClip) DisposeRgn(newClip); if(addition) DisposeRgn(addition); if (drawSettings -> fillCode != kNoFillCode) PolyHdl = OpenPoly (); else { PolyHdl = OpenPoly (); //Our_PmForeColor (gDrawBitmapInBlackAndWhite ? kBlackColorInd : drawSettings -> foreColorInd); Our_PmForeColor (drawSettings -> foreColorInd); } GetObjectESICode ((ObjectRecHdl) MapPolyHdl,&esiCode); if (esiCode>0) // -500 is the default { //halfPenWidth = penWidth/2; #ifdef MAC PenSize(penWidth,penWidth); #else PenStyle(BLACK,penWidth); #endif } for (PointIndex = 0,skippedAPt = false,prevSectionOfPlane = -1; PointIndex < PointCount; ++PointIndex) { MatrixPt = (*RgnPtsHdl) [PointIndex]; // theMap -> GetScrPoint (&MatrixPt, &ThisScrPt); //ThisScrPt.h = SameDifferenceX(MatrixPt.h); //ThisScrPt.v = (gRect.bottom + gRect.top) - SameDifferenceY(MatrixPt.v); ThisScrPt = GetQuickDrawPt(MatrixPt.h, MatrixPt.v, &gRect, &offQuickDrawPlane); // code goes here, what to do when point is off quickdraw plane? //if (offQuickDrawPlane) break; ThisScrPt.h += drawSettings -> offsetDx; ThisScrPt.v += drawSettings -> offsetDy; if(PolyHdl) { //// JLM 2/18/99 // for points outside the drawing area, it is not necessary to move to the correct point, // as long as we preserve the winding. This allows us to ignore many of the points outside // the drawing rectangle gRect thisSectionOfPlane = SectionOfPlane(&fuzzyRect,ThisScrPt); if( thisSectionOfPlane > 0 // outside of the rectangle && thisSectionOfPlane == prevSectionOfPlane // we have not changed sections of the plane && PointIndex < PointCount -1) // not the last point canSkipThisPt = true; else canSkipThisPt = false; prevSectionOfPlane = thisSectionOfPlane; if(canSkipThisPt) { skippedAPt = true; lastSkippedPt =ThisScrPt; continue; } /// JLM 3/6/01 switch(thisSectionOfPlane) { case 1: alwaysIn456 = false; alwaysIn386 = false; break; case 2: alwaysIn174 = false; alwaysIn456 = false; alwaysIn386 = false; break; case 3: alwaysIn174 = false; alwaysIn456 = false; break; case 4: alwaysIn123 = false; alwaysIn386 = false; break; case 5: alwaysIn123 = false; alwaysIn174 = false; alwaysIn386 = false; break; case 6: alwaysIn123 = false; alwaysIn174 = false; break; case 7: alwaysIn123 = false; alwaysIn456 = false; alwaysIn386 = false; break; case 8: alwaysIn123 = false; alwaysIn174 = false; alwaysIn456 = false; break; default: alwaysIn123 = false; alwaysIn174 = false; alwaysIn456 = false; alwaysIn386 = false; break; } ////// if(skippedAPt) { // then we have to draw to the previous point // before we draw to the current point PointIndex--; //so we do the previous point below ThisScrPt = lastSkippedPt; // restore the coordinates of the previous point prevSectionOfPlane = -1; // force the next point to not be skipped } skippedAPt = false; if(PlotCount > MAXNUMSEGMENTS) { // there is a bug on the max when the number of points gets too large // try recusion ClosePoly(); KillPoly(PolyHdl); SetClip(saveClip);// JLM 8/4/99 goto recursion; } ////////////// } if (PointIndex == 0) { MyMoveTo (ThisScrPt.h-halfPenWidth, ThisScrPt.v-halfPenWidth); FirstScrPt = ThisScrPt; LastScrPt = ThisScrPt; PlotCount = 0; } else { if (LastScrPt.h != ThisScrPt.h || LastScrPt.v != ThisScrPt.v) { MyLineTo (ThisScrPt.h-halfPenWidth, ThisScrPt.v-halfPenWidth); LastScrPt = ThisScrPt; ++PlotCount; } } } if (drawSettings -> bClosed) /* draw a line from last point to first point if requested */ { MyLineTo (FirstScrPt.h-halfPenWidth, FirstScrPt.v-halfPenWidth); ++PlotCount; } if (PolyHdl != nil) { ClosePoly (); ////////////// JLM 3/6/01 if(alwaysIn123 || alwaysIn174 || alwaysIn456 || alwaysIn386) canSkipDrawingPolygon = true; if(canSkipDrawingPolygon) PlotCount = 0; // so that we skip the code below //////////// if (PlotCount > 0) { if (PlotCount > 2) /* polygon must contain more than 2 line-to points */ { if (drawSettings -> bErase || (drawSettings -> fillCode == kNoFillCode && drawSettings -> backColorInd == kWaterColorInd)) ErasePoly (PolyHdl); if (drawSettings -> fillCode == kPaintFillCode) { // this is the usual drawing code Our_PmForeColor (bDrawBlackAndWhite || gDrawBitmapInBlackAndWhite ? kBlackColorInd : drawSettings -> foreColorInd);//JLM if(bDrawBlackAndWhite) SetPenPat(UPSTRIPES); PaintPoly(PolyHdl);//JLM if(bDrawBlackAndWhite) SetPenPat(BLACK); } else if (drawSettings -> fillCode == kPatFillCode) FillPoly (PolyHdl, &(drawSettings -> backPattern)); } if (drawSettings -> frameCode == kPaintFrameCode) { Our_PmForeColor (bDrawBlackAndWhite || gDrawBitmapInBlackAndWhite ? kBlackColorInd : drawSettings -> foreColorInd); FramePoly (PolyHdl); } else if (drawSettings -> frameCode == kPatFrameCode) { PenPat (&(drawSettings -> forePattern)); FramePoly (PolyHdl); } } KillPoly (PolyHdl); } SetClip(saveClip); if(saveClip) DisposeRgn(saveClip); } #ifdef MAC PenSize(1,1); #else PenStyle(BLACK,1); #endif return; //////////////////////////////// recursion: //////////////////////////////// { #define MAXRECURSION 20 static short sRecursionValue = 0; if(sRecursionValue >= MAXRECURSION) { printError("max recusion exceeded"); } else { // use recursion Rect subBoundingRect; long middleH = (subRect.left+subRect.right)/2; long middleV = (subRect.top+subRect.bottom)/2; long index; sRecursionValue++; // divide the points up and Draw again for(index = 0; index < 4; index++) { subBoundingRect = subRect; switch(index) { case 0: subBoundingRect.top = middleV; subBoundingRect.left = middleH; break; case 1: subBoundingRect.top = middleV; subBoundingRect.right = middleH; break; case 2: subBoundingRect.bottom = middleV; subBoundingRect.left = middleH; break; default: subBoundingRect.bottom = middleV; subBoundingRect.right = middleH; break; } // the recursive call DrawNoSectPolyRecursive (theMap,MapPolyHdl,drawSettings,subBoundingRect); } // all done sRecursionValue--; return; } } }
OSErr DrawSectPoly (CMap* theMap, PolyObjectHdl MapPolyHdl, DrawSpecRecPtr drawSettings) { long SegCount, SegIndex, SegIndexPlus, PlotCount; LongPoint MatrixPt; Point ThisScrPt; OSErr ErrCode = 0; Boolean DrawFromSegFlag; PolyHandle PolyHdl = nil; SegmentsHdl SectSegHdl = nil; LongRect sectLRect; Rect ScrPolyRect; theMap -> GetMapDrawRect (&ScrPolyRect); InsetRect (&ScrPolyRect, -1, -1); theMap -> GetMatrixLRect (&ScrPolyRect, §LRect); SectSegHdl = MakeSectPoly (§LRect, MapPolyHdl); if (SectSegHdl != nil) { SegCount = _GetHandleSize ((Handle) SectSegHdl) / sizeof (Segment); PolyHdl = OpenPoly (); DrawFromSegFlag = true; PlotCount = 0; Boolean bDrawBlackAndWhite = (sharedPrinting && settings.printMode != COLORMODE); for (SegIndex = 0; SegIndex < SegCount; ++SegIndex) { if (DrawFromSegFlag) /* start of new poly */ { MatrixPt.h = (*SectSegHdl) [SegIndex].fromLong; MatrixPt.v = (*SectSegHdl) [SegIndex].fromLat; theMap -> GetScrPoint (&MatrixPt, &ThisScrPt); MyMoveTo (ThisScrPt.h, ThisScrPt.v); DrawFromSegFlag = false; PlotCount = 0; } MatrixPt.h = (*SectSegHdl) [SegIndex].toLong; MatrixPt.v = (*SectSegHdl) [SegIndex].toLat; theMap -> GetScrPoint (&MatrixPt, &ThisScrPt); MyLineTo (ThisScrPt.h, ThisScrPt.v); ++PlotCount; SegIndexPlus = SegIndex + 1; if (SegIndexPlus == SegCount) SegIndexPlus = 0; /* check for end of current poly */ if (((*SectSegHdl) [SegIndex].toLat != (*SectSegHdl) [SegIndexPlus].fromLat || (*SectSegHdl) [SegIndex].toLong != (*SectSegHdl) [SegIndexPlus].fromLong)) { ClosePoly (); if (PlotCount > 0) { if (PlotCount > 2) { if (drawSettings -> bErase) ErasePoly (PolyHdl); if (drawSettings -> fillCode == kPaintFillCode) { // this is the usual drawing code Our_PmForeColor (bDrawBlackAndWhite || gDrawBitmapInBlackAndWhite ? kBlackColorInd : drawSettings -> foreColorInd);//JLM if(bDrawBlackAndWhite) SetPenPat(UPSTRIPES); PaintPoly(PolyHdl);//JLM if(bDrawBlackAndWhite) SetPenPat(BLACK); } else if (drawSettings -> fillCode == kPatFillCode) FillPoly (PolyHdl, &(drawSettings -> backPattern)); } if (drawSettings -> frameCode == kPaintFrameCode) { Our_PmForeColor (bDrawBlackAndWhite || gDrawBitmapInBlackAndWhite ? kBlackColorInd : drawSettings -> foreColorInd); FramePoly (PolyHdl); } else if (drawSettings -> frameCode == kPatFrameCode) { PenPat (&(drawSettings -> forePattern)); FramePoly (PolyHdl); } } KillPoly (PolyHdl); /* now open a new poly for the next set of segments */ PolyHdl = OpenPoly (); DrawFromSegFlag = true; } } ClosePoly (); if (PlotCount > 0) { if (PlotCount > 2) /* must have at least 3 segments to fill-poly */ { if (drawSettings -> bErase) ErasePoly (PolyHdl); if (drawSettings -> fillCode == kPaintFillCode) { Our_PmForeColor (drawSettings -> backColorInd); FillPoly (PolyHdl, &(drawSettings -> backPattern)); } else if (drawSettings -> fillCode == kPatFillCode) FillPoly (PolyHdl, &(drawSettings -> backPattern)); } if (drawSettings -> frameCode == kPaintFrameCode) { Our_PmForeColor (drawSettings -> foreColorInd); FramePoly (PolyHdl); } else if (drawSettings -> frameCode == kPatFrameCode) { PenPat (&(drawSettings -> forePattern)); FramePoly (PolyHdl); } } KillPoly (PolyHdl); DisposeHandle ((Handle) SectSegHdl); } return (ErrCode); }
void ComboBox::Draw() { int x = 0; int y = 0; int w = rect.w; int h = rect.h; if (w < 1 || h < 1 || !shown) return; Rect btn_rect(x,y,w,h); // draw the bevel: DrawRectSimple(btn_rect, button_state); // draw the border: if (border) DrawRect(0,0,w-1,h-1,border_color); // draw the arrow: POINT arrow[3]; double h3 = (double)h/3.0; arrow[0].x = (int) (w-2*h3); arrow[0].y = (int) (h3); arrow[1].x = (int) (w-h3); arrow[1].y = (int) (h3); arrow[2].x = (int) ((arrow[1].x + arrow[0].x)/2); arrow[2].y = (int) (2*h3); FillPoly(3, arrow, border_color); // draw text here: Text caption = text; if (GetSelectedIndex() >= 0) caption = GetSelectedItem(); if (font && caption.length()) { int border_size = 4; if (style & WIN_RAISED_FRAME && style & WIN_SUNK_FRAME) border_size = 8; Rect label_rect = CalcLabelRect(); int vert_space = label_rect.h; int horz_space = label_rect.w; DrawText(caption.data(), 0, label_rect, DT_CALCRECT | DT_WORDBREAK | text_align); vert_space = (vert_space - label_rect.h)/2; label_rect.w = horz_space; if (vert_space > 0) label_rect.y += vert_space; if (animated && button_state > 0) { label_rect.x += button_state; label_rect.y += button_state; } font->SetColor(fore_color); DrawText(caption.data(), 0, label_rect, DT_WORDBREAK | text_align); } }
void R004PseudoTexture::Render() { m_viewport->Clear(); MatrixStack mstackvertices; MatrixStack mstacknormals; // TODO: sort meshes mstackvertices.PushMatrix(m_camera->m_projectionmatrix); mstackvertices.PushMatrix(m_camera->m_viewmatrix); mstacknormals.PushMatrix(m_camera->m_viewmatrix); for (int i=0 ; i<m_scene->m_meshCount ; i++) { Mesh *mesh = m_scene->m_meshes[i]; //mstackvertices.PushMatrix(mesh->m_worldmatrix); //mstacknormals.PushMatrix(mesh->m_worldmatrix); // Transforming vertices into screen coords Vec3f *vertices = new Vec3f[mesh->m_vertexcount]; for (unsigned int v=0 ; v<mesh->m_vertexcount ; v++) { Vec3f vec = mesh->m_vertexbuffer[v]; vec = vec * mstackvertices.GetTopMatrix(); vec.x = vec.x / ( (vec.z>0) ? (vec.z) : (-vec.z) ); vec.y = vec.y / ( (vec.z>0) ? (vec.z) : (-vec.z) ); vec = vec * m_viewport->m_viewportmatrix; vertices[v] = vec; } // Reading index buffer and drawing lines for (unsigned int s=0 ; s<mesh->m_stripcount ; s++) { Strip *strip = mesh->m_strips[s]; Vec3f v0,v1,v2; v0 = vertices[strip->m_indexbuffer[0]]; v1 = vertices[strip->m_indexbuffer[1]]; for (unsigned i=2 ; i<strip->m_indexcount ; i++) { v2 = vertices[strip->m_indexbuffer[i]]; // backface culling Vec3f cullingnormal = ((v1-v0).Cross((v2-v0))); if (cullingnormal.z < 0) // TODO dotproduct with camera ? { // Calculate flat shading Vec3f normal = (mesh->m_vertexbuffer[strip->m_indexbuffer[i]]-mesh->m_vertexbuffer[strip->m_indexbuffer[0]]) .Cross(mesh->m_vertexbuffer[strip->m_indexbuffer[i-1]]-mesh->m_vertexbuffer[strip->m_indexbuffer[0]]); normal = normal.Mul3x3(mstacknormals.GetTopMatrix()); normal.Normalize(); Vec3f frontvec; frontvec.z = 1; float normaldotproduct = normal.Dot(frontvec); if (normaldotproduct > 0) normaldotproduct = 0; unsigned char shade = (unsigned char) ((normaldotproduct * (-200.0f)) + 55.0f); // Fill poly FillPoly(v0, v1, v2, shade); } v1 = v2; } } //mstack.PopMatrix(); // Remove world matrix (the mesh one) delete vertices; } }