bool GiGraphics::drawLines(const GiContext* ctx, int count, const Point2d* points, bool modelUnit) { if (m_impl->drawRefcnt == 0 || count < 2 || points == NULL) return false; if (count > 0x2000) count = 0x2000; GiLock lock (&m_impl->drawRefcnt); int i; Point2d pt1, pt2, ptLast; vector<Point2d> pxpoints; vector<Point2d> pointBuf; bool ret = false; Matrix2d matD(S2D(xf(), modelUnit)); const Box2d extent (count, points); // 模型坐标范围 if (!DRAW_RECT(m_impl, modelUnit).isIntersect(extent)) // 全部在显示区域外 return false; if (DRAW_MAXR(m_impl, modelUnit).contains(extent)) // 全部在显示区域内 { pxpoints.resize(count); Point2d* pxs = &pxpoints.front(); int n = 0; for (i = 0; i < count; i++) { pt2 = points[i] * matD; if (i == 0 || fabs(pt1.x - pt2.x) > 2 || fabs(pt1.y - pt2.y) > 2) { pt1 = pt2; pxs[n++] = pt2; } } ret = rawLines(ctx, pxs, n); } else // 部分在显示区域内 { pointBuf.resize(count); for (i = 0; i < count; i++) // 转换到像素坐标 pointBuf[i] = points[i] * matD; Point2d* pts = &pointBuf.front(); ptLast = pts[0]; PolylineAux aux(this, ctx); for (i = 0; i < count - 1; i++) { ret = DrawEdge(count, i, pts, ptLast, aux, m_impl->rectDraw) || ret; } } return ret; }
bool ossimGeneralRasterInfo::saveState(ossimKeywordlist& kwl, const char* prefix) const { for (ossim_uint32 i=0; i<theImageFileList.size(); ++i) { ossimString kw = ossimKeywordNames::FILENAME_KW; kw += ossimString::toString(i+1); kwl.add(prefix, theImageFileList[i].c_str()); } theMetaData.saveState(kwl, prefix); kwl.add(prefix, NUMBER_LINES, ossimString::toString( rawLines() ), true); kwl.add(prefix, NUMBER_SAMPLES, ossimString::toString( rawSamples() ), true); kwl.add(prefix, HEADER_SIZE, ossimString::toString(theHeaderSize), true); kwl.add(prefix, SUB_IMAGE_OFFSET_LINE, theSubImageOffset.line, true); kwl.add(prefix, SUB_IMAGE_OFFSET_SAMP, theSubImageOffset.samp, true); kwl.add(prefix, VALID_START_LINE, theValidImageRect.ul().y, true); kwl.add(prefix, VALID_STOP_LINE, theValidImageRect.lr().y, true); kwl.add(prefix, VALID_START_SAMPLE, theValidImageRect.ul().x, true); kwl.add(prefix, VALID_STOP_SAMPLE, theValidImageRect.ur().x, true); kwl.add(prefix, ossimKeywordNames::INTERLEAVE_TYPE_KW, INTERLEAVE_TYPE_LUT.getEntryString(theInterleaveType), true); kwl.add(prefix, PIXELS_TO_CHOP, thePixelsToChop, true); kwl.add(prefix, SET_NULLS, theSetNullsMode, true); if (bytesPerPixel() > 1) { kwl.add(prefix, ossimKeywordNames::BYTE_ORDER_KW, (theImageDataByteOrder == OSSIM_LITTLE_ENDIAN ? "little_endian" : "big_endian"), true); } return true; }