static int DrawCells(Engine *engine, GpReal px, GpReal py, GpReal qx, GpReal qy, long width, long height, long nColumns, const GpColor *colors) { XEngine *xeng = (XEngine *)engine; p_win *w = xeng->w; GpXYMap *map= &xeng->e.map; int i0, j0, di, dj, ncols, nrows, x0, y0, x1, y1; if (!w || !xeng->mapped) return 1; chk_clipping(xeng); if (GetCells(&map->x, gistT.window.xmin, gistT.window.xmax, px, qx, width, &i0, &di, &ncols, &x0, &x1) && GetCells(&map->y, gistT.window.ymin, gistT.window.ymax, py, qy, height, &j0, &dj, &nrows, &y0, &y1)) { unsigned char *ndxs = (unsigned char *)colors; if (di<0 || dj<0 || ncols!=width || nrows!=height || nColumns!=width) { int r, c, nr, nc, i, j; ndxs = p_malloc(gistA.rgb?3*ncols*nrows:ncols*nrows); j0 *= nColumns; dj *= nColumns; if (gistA.rgb) { for (j=j0,c=0,nr=nrows ; nr-- ; j+=dj,c+=ncols) { nc = ncols; for (i=i0,r=0 ; nc-- ; i+=di,r++) { ndxs[3*(c+r)] = colors[3*(j+i)]; ndxs[3*(c+r)+1] = colors[3*(j+i)+1]; ndxs[3*(c+r)+2] = colors[3*(j+i)+2]; } } } else { for (j=j0,c=0,nr=nrows ; nr-- ; j+=dj,c+=ncols) { nc = ncols; for (i=i0,r=0 ; nc-- ; i+=di,r++) ndxs[c+r] = colors[j+i]; } } } if (ncols && nrows) { if (gistA.rgb) p_rgb_cell(w, ndxs, ncols, nrows, x0, y0, x1, y1); else p_ndx_cell(w, ndxs, ncols, nrows, x0, y0, x1, y1); } if (ndxs!=colors) p_free(ndxs); } xeng->e.marked = 1; return 0; }
NS_IMETHODIMP nsHTMLTableRowElement::InsertCell(PRInt32 aIndex, nsIDOMHTMLElement** aValue) { *aValue = nsnull; if (aIndex < -1) { return NS_ERROR_DOM_INDEX_SIZE_ERR; } // Make sure mCells is initialized. nsCOMPtr<nsIDOMHTMLCollection> cells; nsresult rv = GetCells(getter_AddRefs(cells)); if (NS_FAILED(rv)) { return rv; } NS_ASSERTION(mCells, "How did that happen?"); nsCOMPtr<nsIDOMNode> nextSibling; // -1 means append, so should use null nextSibling if (aIndex != -1) { cells->Item(aIndex, getter_AddRefs(nextSibling)); // Check whether we're inserting past end of list. We want to avoid doing // this unless we really have to, since this has to walk all our kids. If // we have a nextSibling, we're clearly not past end of list. if (!nextSibling) { PRUint32 cellCount; cells->GetLength(&cellCount); if (aIndex > PRInt32(cellCount)) { return NS_ERROR_DOM_INDEX_SIZE_ERR; } } } // create the cell nsCOMPtr<nsINodeInfo> nodeInfo; nsContentUtils::NameChanged(mNodeInfo, nsGkAtoms::td, getter_AddRefs(nodeInfo)); nsCOMPtr<nsIContent> cellContent = NS_NewHTMLTableCellElement(nodeInfo.forget()); if (!cellContent) { return NS_ERROR_OUT_OF_MEMORY; } nsCOMPtr<nsIDOMNode> cellNode(do_QueryInterface(cellContent)); NS_ASSERTION(cellNode, "Should implement nsIDOMNode!"); nsCOMPtr<nsIDOMNode> retChild; InsertBefore(cellNode, nextSibling, getter_AddRefs(retChild)); if (retChild) { CallQueryInterface(retChild, aValue); } return NS_OK; }
NS_IMETHODIMP nsHTMLTableRowElement::InsertCell(PRInt32 aIndex, nsIDOMHTMLElement** aValue) { *aValue = nsnull; if (aIndex < -1) { return NS_ERROR_DOM_INDEX_SIZE_ERR; } nsCOMPtr<nsIDOMHTMLCollection> cells; GetCells(getter_AddRefs(cells)); PRUint32 cellCount; cells->GetLength(&cellCount); if (aIndex > PRInt32(cellCount)) { return NS_ERROR_DOM_INDEX_SIZE_ERR; } PRBool doInsert = (aIndex < PRInt32(cellCount)) && (aIndex != -1); // create the cell nsCOMPtr<nsINodeInfo> nodeInfo; nsContentUtils::NameChanged(mNodeInfo, nsGkAtoms::td, getter_AddRefs(nodeInfo)); nsCOMPtr<nsIContent> cellContent = NS_NewHTMLTableCellElement(nodeInfo); if (!cellContent) { return NS_ERROR_OUT_OF_MEMORY; } nsCOMPtr<nsIDOMNode> cellNode(do_QueryInterface(cellContent)); NS_ASSERTION(cellNode, "Should implement nsIDOMNode!"); nsCOMPtr<nsIDOMNode> retChild; nsresult rv; if (doInsert) { nsCOMPtr<nsIDOMNode> refCell; cells->Item(aIndex, getter_AddRefs(refCell)); rv = InsertBefore(cellNode, refCell, getter_AddRefs(retChild)); } else { rv = AppendChild(cellNode, getter_AddRefs(retChild)); } if (retChild) { CallQueryInterface(retChild, aValue); } return NS_OK; }
NS_IMETHODIMP nsHTMLTableRowElement::DeleteCell(PRInt32 aValue) { if (aValue < -1) { return NS_ERROR_DOM_INDEX_SIZE_ERR; } nsCOMPtr<nsIDOMHTMLCollection> cells; GetCells(getter_AddRefs(cells)); nsresult rv; PRUint32 refIndex; if (aValue == -1) { rv = cells->GetLength(&refIndex); NS_ENSURE_SUCCESS(rv, rv); if (refIndex == 0) { return NS_OK; } --refIndex; } else { refIndex = (PRUint32)aValue; } nsCOMPtr<nsIDOMNode> cell; rv = cells->Item(refIndex, getter_AddRefs(cell)); NS_ENSURE_SUCCESS(rv, rv); if (!cell) { return NS_ERROR_DOM_INDEX_SIZE_ERR; } nsCOMPtr<nsIDOMNode> retChild; return RemoveChild(cell, getter_AddRefs(retChild)); }