Esempio n. 1
0
//
// DrawSelf
//
// Draw the control using currently registered callbacks
//
void ICGrid::DrawSelf(PaintInfo &pi)
{
  // Draw a frame
  DrawCtrlFrame(pi);

  // Do we have a cell iteration callback
  if (cellFunc)
  {
    // Window top left pixel position
    U32 xp1 = pi.client.p0.x;
    U32 yp1 = pi.client.p0.y;

    // Initial pixel positions for each axis (changes for flipping)
    U32 xip = xFlip ? xp1 + gridSize.x * cellSize.x - cellSize.x : xp1;
    U32 yip = yFlip ? yp1 + gridSize.y * cellSize.y - cellSize.y : yp1;

    // Draw the grid
    for (U32 x = 0, px = xip; x < gridSize.x; x++, px = xFlip ? (px - cellSize.x) : (px + cellSize.x))
    {
      for (U32 y = 0, py = yip; y < gridSize.y; y++, py = yFlip ? (py - cellSize.y) : (py + cellSize.y))
      {
        // Get the color from the callback
        Color color = cellFunc(context, x, y);

        // And paint this cell
        IFace::RenderRectangle(ClipRect(px, py, px + cellSize.x, py + cellSize.y), color);
      }
    }

    // Do we have a post-iteration callback
    if (postFunc)
    {
      // Setup paint info
      postPaintInfo = &pi;

      // Trigger the callback
      postFunc(this);

      // Clear data
      postPaintInfo = NULL;
    }

    // Hackville
    if (displaySelected)
    {
      U32 x = selected.x;
      U32 y = selected.y;
      if (xFlip) { x = gridSize.x - x - 1; }
      if (yFlip) { y = gridSize.y - y - 1; }
      U32 xPos = pi.client.p0.x + (x * cellSize.x) + (cellSize.x / 4);
      U32 yPos = pi.client.p0.y + (y * cellSize.y) + (cellSize.y / 4);
      IFace::RenderRectangle(ClipRect(xPos, yPos, xPos + cellSize.x / 2, yPos + cellSize.y / 2), Color(1.0F, 1.0F, 1.0F, 0.5F));
    }
  }
}
Esempio n. 2
0
File: ast.cpp Progetto: Amos-zq/ispc
ASTNode *
WalkAST(ASTNode *node, ASTPreCallBackFunc preFunc, ASTPostCallBackFunc postFunc,
        void *data) {
    if (node == NULL)
        return node;

    // Call the callback function
    if (preFunc != NULL) {
        if (preFunc(node, data) == false)
            // The function asked us to not continue recursively, so stop.
            return node;
    }

    ////////////////////////////////////////////////////////////////////////////
    // Handle Statements
    if (llvm::dyn_cast<Stmt>(node) != NULL) {
        ExprStmt *es;
        DeclStmt *ds;
        IfStmt *is;
        DoStmt *dos;
        ForStmt *fs;
        ForeachStmt *fes;
        ForeachActiveStmt *fas;
        ForeachUniqueStmt *fus;
        CaseStmt *cs;
        DefaultStmt *defs;
        SwitchStmt *ss;
        ReturnStmt *rs;
        LabeledStmt *ls;
        StmtList *sl;
        PrintStmt *ps;
        AssertStmt *as;
        DeleteStmt *dels;
        UnmaskedStmt *ums;

        if ((es = llvm::dyn_cast<ExprStmt>(node)) != NULL)
            es->expr = (Expr *)WalkAST(es->expr, preFunc, postFunc, data);
        else if ((ds = llvm::dyn_cast<DeclStmt>(node)) != NULL) {
            for (unsigned int i = 0; i < ds->vars.size(); ++i)
                ds->vars[i].init = (Expr *)WalkAST(ds->vars[i].init, preFunc,
                                                   postFunc, data);
        }
        else if ((is = llvm::dyn_cast<IfStmt>(node)) != NULL) {
            is->test = (Expr *)WalkAST(is->test, preFunc, postFunc, data);
            is->trueStmts = (Stmt *)WalkAST(is->trueStmts, preFunc,
                                            postFunc, data);
            is->falseStmts = (Stmt *)WalkAST(is->falseStmts, preFunc,
                                             postFunc, data);
        }
        else if ((dos = llvm::dyn_cast<DoStmt>(node)) != NULL) {
            dos->testExpr = (Expr *)WalkAST(dos->testExpr, preFunc,
                                            postFunc, data);
            dos->bodyStmts = (Stmt *)WalkAST(dos->bodyStmts, preFunc,
                                             postFunc, data);
        }
        else if ((fs = llvm::dyn_cast<ForStmt>(node)) != NULL) {
            fs->init = (Stmt *)WalkAST(fs->init, preFunc, postFunc, data);
            fs->test = (Expr *)WalkAST(fs->test, preFunc, postFunc, data);
            fs->step = (Stmt *)WalkAST(fs->step, preFunc, postFunc, data);
            fs->stmts = (Stmt *)WalkAST(fs->stmts, preFunc, postFunc, data);
        }
        else if ((fes = llvm::dyn_cast<ForeachStmt>(node)) != NULL) {
            for (unsigned int i = 0; i < fes->startExprs.size(); ++i)
                fes->startExprs[i] = (Expr *)WalkAST(fes->startExprs[i], preFunc,
                                                     postFunc, data);
            for (unsigned int i = 0; i < fes->endExprs.size(); ++i)
                fes->endExprs[i] = (Expr *)WalkAST(fes->endExprs[i], preFunc,
                                                   postFunc, data);
            fes->stmts = (Stmt *)WalkAST(fes->stmts, preFunc, postFunc, data);
        }
        else if ((fas = llvm::dyn_cast<ForeachActiveStmt>(node)) != NULL) {
            fas->stmts = (Stmt *)WalkAST(fas->stmts, preFunc, postFunc, data);
        }
        else if ((fus = llvm::dyn_cast<ForeachUniqueStmt>(node)) != NULL) {
            fus->expr = (Expr *)WalkAST(fus->expr, preFunc, postFunc, data);
            fus->stmts = (Stmt *)WalkAST(fus->stmts, preFunc, postFunc, data);
        }
        else if ((cs = llvm::dyn_cast<CaseStmt>(node)) != NULL)
            cs->stmts = (Stmt *)WalkAST(cs->stmts, preFunc, postFunc, data);
        else if ((defs = llvm::dyn_cast<DefaultStmt>(node)) != NULL)
            defs->stmts = (Stmt *)WalkAST(defs->stmts, preFunc, postFunc, data);
        else if ((ss = llvm::dyn_cast<SwitchStmt>(node)) != NULL) {
            ss->expr = (Expr *)WalkAST(ss->expr, preFunc, postFunc, data);
            ss->stmts = (Stmt *)WalkAST(ss->stmts, preFunc, postFunc, data);
        }
        else if (llvm::dyn_cast<BreakStmt>(node) != NULL ||
                 llvm::dyn_cast<ContinueStmt>(node) != NULL ||
                 llvm::dyn_cast<GotoStmt>(node) != NULL) {
            // nothing
        }
        else if ((ls = llvm::dyn_cast<LabeledStmt>(node)) != NULL)
            ls->stmt = (Stmt *)WalkAST(ls->stmt, preFunc, postFunc, data);
        else if ((rs = llvm::dyn_cast<ReturnStmt>(node)) != NULL)
            rs->expr = (Expr *)WalkAST(rs->expr, preFunc, postFunc, data);
        else if ((sl = llvm::dyn_cast<StmtList>(node)) != NULL) {
            std::vector<Stmt *> &sls = sl->stmts;
            for (unsigned int i = 0; i < sls.size(); ++i)
                sls[i] = (Stmt *)WalkAST(sls[i], preFunc, postFunc, data);
        }
        else if ((ps = llvm::dyn_cast<PrintStmt>(node)) != NULL)
            ps->values = (Expr *)WalkAST(ps->values, preFunc, postFunc, data);
        else if ((as = llvm::dyn_cast<AssertStmt>(node)) != NULL)
            as->expr = (Expr *)WalkAST(as->expr, preFunc, postFunc, data);
        else if ((dels = llvm::dyn_cast<DeleteStmt>(node)) != NULL)
            dels->expr = (Expr *)WalkAST(dels->expr, preFunc, postFunc, data);
        else if ((ums = llvm::dyn_cast<UnmaskedStmt>(node)) != NULL)
            ums->stmts = (Stmt *)WalkAST(ums->stmts, preFunc, postFunc, data);
        else
            FATAL("Unhandled statement type in WalkAST()");
    }
    else {
        ///////////////////////////////////////////////////////////////////////////
        // Handle expressions
        Assert(llvm::dyn_cast<Expr>(node) != NULL);
        UnaryExpr *ue;
        BinaryExpr *be;
        AssignExpr *ae;
        SelectExpr *se;
        ExprList *el;
        FunctionCallExpr *fce;
        IndexExpr *ie;
        MemberExpr *me;
        TypeCastExpr *tce;
        ReferenceExpr *re;
        PtrDerefExpr *ptrderef;
        RefDerefExpr *refderef;
        SizeOfExpr *soe;
        AddressOfExpr *aoe;
        NewExpr *newe;

        if ((ue = llvm::dyn_cast<UnaryExpr>(node)) != NULL)
            ue->expr = (Expr *)WalkAST(ue->expr, preFunc, postFunc, data);
        else if ((be = llvm::dyn_cast<BinaryExpr>(node)) != NULL) {
            be->arg0 = (Expr *)WalkAST(be->arg0, preFunc, postFunc, data);
            be->arg1 = (Expr *)WalkAST(be->arg1, preFunc, postFunc, data);
        }
        else if ((ae = llvm::dyn_cast<AssignExpr>(node)) != NULL) {
            ae->lvalue = (Expr *)WalkAST(ae->lvalue, preFunc, postFunc, data);
            ae->rvalue = (Expr *)WalkAST(ae->rvalue, preFunc, postFunc, data);
        }
        else if ((se = llvm::dyn_cast<SelectExpr>(node)) != NULL) {
            se->test = (Expr *)WalkAST(se->test, preFunc, postFunc, data);
            se->expr1 = (Expr *)WalkAST(se->expr1, preFunc, postFunc, data);
            se->expr2 = (Expr *)WalkAST(se->expr2, preFunc, postFunc, data);
        }
        else if ((el = llvm::dyn_cast<ExprList>(node)) != NULL) {
            for (unsigned int i = 0; i < el->exprs.size(); ++i)
                el->exprs[i] = (Expr *)WalkAST(el->exprs[i], preFunc,
                                               postFunc, data);
        }
        else if ((fce = llvm::dyn_cast<FunctionCallExpr>(node)) != NULL) {
            fce->func = (Expr *)WalkAST(fce->func, preFunc, postFunc, data);
            fce->args = (ExprList *)WalkAST(fce->args, preFunc, postFunc, data);
            for (int k = 0; k < 3; k++)
              fce->launchCountExpr[0] = (Expr *)WalkAST(fce->launchCountExpr[0], preFunc,
                                                   postFunc, data);
        }
        else if ((ie = llvm::dyn_cast<IndexExpr>(node)) != NULL) {
            ie->baseExpr = (Expr *)WalkAST(ie->baseExpr, preFunc, postFunc, data);
            ie->index = (Expr *)WalkAST(ie->index, preFunc, postFunc, data);
        }
        else if ((me = llvm::dyn_cast<MemberExpr>(node)) != NULL)
            me->expr = (Expr *)WalkAST(me->expr, preFunc, postFunc, data);
        else if ((tce = llvm::dyn_cast<TypeCastExpr>(node)) != NULL)
            tce->expr = (Expr *)WalkAST(tce->expr, preFunc, postFunc, data);
        else if ((re = llvm::dyn_cast<ReferenceExpr>(node)) != NULL)
            re->expr = (Expr *)WalkAST(re->expr, preFunc, postFunc, data);
        else if ((ptrderef = llvm::dyn_cast<PtrDerefExpr>(node)) != NULL)
            ptrderef->expr = (Expr *)WalkAST(ptrderef->expr, preFunc, postFunc,
                                             data);
        else if ((refderef = llvm::dyn_cast<RefDerefExpr>(node)) != NULL)
            refderef->expr = (Expr *)WalkAST(refderef->expr, preFunc, postFunc,
                                             data);
        else if ((soe = llvm::dyn_cast<SizeOfExpr>(node)) != NULL)
            soe->expr = (Expr *)WalkAST(soe->expr, preFunc, postFunc, data);
        else if ((aoe = llvm::dyn_cast<AddressOfExpr>(node)) != NULL)
            aoe->expr = (Expr *)WalkAST(aoe->expr, preFunc, postFunc, data);
        else if ((newe = llvm::dyn_cast<NewExpr>(node)) != NULL) {
            newe->countExpr = (Expr *)WalkAST(newe->countExpr, preFunc,
                                              postFunc, data);
            newe->initExpr = (Expr *)WalkAST(newe->initExpr, preFunc,
                                             postFunc, data);
        }
        else if (llvm::dyn_cast<SymbolExpr>(node) != NULL ||
                 llvm::dyn_cast<ConstExpr>(node) != NULL ||
                 llvm::dyn_cast<FunctionSymbolExpr>(node) != NULL ||
                 llvm::dyn_cast<SyncExpr>(node) != NULL ||
                 llvm::dyn_cast<NullPointerExpr>(node) != NULL) {
            // nothing to do
        }
        else
            FATAL("Unhandled expression type in WalkAST().");
    }

    // Call the callback function
    if (postFunc != NULL)
        return postFunc(node, data);
    else
        return node;
}