void DjVuEngineImpl::AddUserAnnots(RenderedBitmap *bmp, int pageNo, float zoom, int rotation, RectI screen) { if (!bmp || userAnnots.Count() == 0) return; HDC hdc = CreateCompatibleDC(NULL); HGDIOBJ prevBmp = SelectObject(hdc, bmp->GetBitmap()); { using namespace Gdiplus; Graphics g(hdc); g.SetCompositingQuality(CompositingQualityHighQuality); g.SetPageUnit(UnitPixel); for (size_t i = 0; i < userAnnots.Count(); i++) { PageAnnotation& annot = userAnnots.At(i); if (annot.pageNo != pageNo) continue; RectD arect; switch (annot.type) { case Annot_Highlight: arect = Transform(annot.rect, pageNo, zoom, rotation); arect.Offset(-screen.x, -screen.y); g.FillRectangle(&SolidBrush(Unblend(annot.color, 119)), arect.ToGdipRectF()); break; case Annot_Underline: case Annot_StrikeOut: arect = RectD(annot.rect.x, annot.rect.BR().y, annot.rect.dx, 0); if (Annot_StrikeOut == annot.type) arect.y -= annot.rect.dy / 2; arect = Transform(arect, pageNo, zoom, rotation); arect.Offset(-screen.x, -screen.y); g.DrawLine(&Pen(FromColor(annot.color), zoom), (float)arect.x, (float)arect.y, (float)arect.BR().x, (float)arect.BR().y); break; case Annot_Squiggly: { Pen p(FromColor(annot.color), 0.5f * zoom); REAL dash[2] = { 2, 2 }; p.SetDashPattern(dash, dimof(dash)); p.SetDashOffset(1); arect = Transform(RectD(annot.rect.x, annot.rect.BR().y - 0.25f, annot.rect.dx, 0), pageNo, zoom, rotation); arect.Offset(-screen.x, -screen.y); g.DrawLine(&p, (float)arect.x, (float)arect.y, (float)arect.BR().x, (float)arect.BR().y); p.SetDashOffset(3); arect = Transform(RectD(annot.rect.x, annot.rect.BR().y + 0.25f, annot.rect.dx, 0), pageNo, zoom, rotation); arect.Offset(-screen.x, -screen.y); g.DrawLine(&p, (float)arect.x, (float)arect.y, (float)arect.BR().x, (float)arect.BR().y); } break; } } } SelectObject(hdc, prevBmp); DeleteDC(hdc); }
RectD DjVuEngineImpl::Transform(RectD rect, int pageNo, float zoom, int rotation, bool inverse) { PointD TL = Transform(rect.TL(), pageNo, zoom, rotation, inverse); PointD BR = Transform(rect.BR(), pageNo, zoom, rotation, inverse); return RectD::FromXY(TL, BR); }