diff --git a/uppsrc/CtrlLib/ArrayCtrl.cpp b/uppsrc/CtrlLib/ArrayCtrl.cpp index 489cbcc8b..81c255db6 100644 --- a/uppsrc/CtrlLib/ArrayCtrl.cpp +++ b/uppsrc/CtrlLib/ArrayCtrl.cpp @@ -496,9 +496,7 @@ void ArrayCtrl::Set0(int i, int ii, const Value& v) { } void ArrayCtrl::Set(int i, const Vector& v) { - RTIMING("Set0"); array.At(i).line.Clear(); - RTIMING("Set1"); for(int ii = 0; ii < v.GetCount(); ii++) Set0(i, ii, v[ii]); AfterSet(i); @@ -507,8 +505,6 @@ void ArrayCtrl::Set(int i, const Vector& v) { } void ArrayCtrl::Set(int i, Vector&& v) { - RTIMING("Set0"); - RTIMING("Set1"); Vector& line = array.At(i).line; if(hasctrls || i == cursor) { line.Clear(); @@ -524,7 +520,6 @@ void ArrayCtrl::Set(int i, Vector&& v) { void ArrayCtrl::AfterSet(int i) { - RTIMING("AfterSet"); SetSb(); Refresh(); SyncInfo(); diff --git a/uppsrc/Draw/Draw.h b/uppsrc/Draw/Draw.h index 11e7b08d1..959adcd2b 100644 --- a/uppsrc/Draw/Draw.h +++ b/uppsrc/Draw/Draw.h @@ -954,9 +954,15 @@ void DrawXPButton(Draw& w, Rect r, int type); struct PdfSignatureInfo; typedef String (*DrawingToPdfFnType)(const Array& report, Size pagesize, int margin, bool pdfa, const PdfSignatureInfo *sign); +typedef void (*PdfDrawJPEGFnType)(Draw& w, int x, int y, int cx, int cy, const String& jpeg_data); -void SetDrawingToPdfFn(DrawingToPdfFnType Pdf); +void SetDrawingToPdfFn(DrawingToPdfFnType Pdf, PdfDrawJPEGFnType Jpeg); DrawingToPdfFnType GetDrawingToPdfFn(); +PdfDrawJPEGFnType GetPdfDrawJPEGFn(); + +typedef bool (*IsJPGFnType)(StreamRaster *s); +void SetIsJPGFn(IsJPGFnType isjpg); +IsJPGFnType GetIsJPGFn(); #include "Display.h" #include "Cham.h" diff --git a/uppsrc/Draw/DrawUtil.cpp b/uppsrc/Draw/DrawUtil.cpp index e0170c2bc..b440d7457 100644 --- a/uppsrc/Draw/DrawUtil.cpp +++ b/uppsrc/Draw/DrawUtil.cpp @@ -581,10 +581,12 @@ void DrawXPButton(Draw& w, Rect r, int type) } static DrawingToPdfFnType sPdf; +static PdfDrawJPEGFnType sJpeg; -void SetDrawingToPdfFn(DrawingToPdfFnType Pdf) +void SetDrawingToPdfFn(DrawingToPdfFnType Pdf, PdfDrawJPEGFnType Jpeg) { sPdf = Pdf; + sJpeg = Jpeg; } DrawingToPdfFnType GetDrawingToPdfFn() @@ -592,6 +594,23 @@ DrawingToPdfFnType GetDrawingToPdfFn() return sPdf; } +PdfDrawJPEGFnType GetPdfDrawJPEGFn() +{ + return sJpeg; +} + +static IsJPGFnType sIsJPG; + +void SetIsJPGFn(IsJPGFnType isjpg) +{ + sIsJPG = isjpg; +} + +IsJPGFnType GetIsJPGFn() +{ + return sIsJPG; +} + Image (*render_glyph)(int cx, int x, Font font, int chr, int py, int pcy); Image RenderGlyph(int cx, int x, Font font, int chr, int py, int pcy) diff --git a/uppsrc/PdfDraw/PdfReport.cpp b/uppsrc/PdfDraw/PdfReport.cpp index 51ed030ed..75e12a01d 100644 --- a/uppsrc/PdfDraw/PdfReport.cpp +++ b/uppsrc/PdfDraw/PdfReport.cpp @@ -16,7 +16,7 @@ String Pdf(const Array& report, Size sz, int margin, bool pdfa, INITIALIZER(PdfDraw) { - SetDrawingToPdfFn(Pdf); + SetDrawingToPdfFn(Pdf, DrawJPEG); } } diff --git a/uppsrc/RichText/RichImage.cpp b/uppsrc/RichText/RichImage.cpp index 7bad4cfde..78c28470d 100644 --- a/uppsrc/RichText/RichImage.cpp +++ b/uppsrc/RichText/RichImage.cpp @@ -241,17 +241,20 @@ void RichRawImage::Paint(const Value& data, Draw& w, Size sz, void *) const One r = StreamRaster::OpenAny(ss); if(r) { Size isz = r->GetSize(); + if(GetIsJPGFn() && GetIsJPGFn()(~r) && GetPdfDrawJPEGFn()) + GetPdfDrawJPEGFn()(w, 0, 0, sz.cx, sz.cy, data); + else if(isz.cx * isz.cy > sz.cx * sz.cy) { // conserve memory by scaling down from source ImageEncoder m; - Rescale(m, sz, *r, r->GetSize()); + Rescale(m, sz, *r, isz); w.DrawImage(0, 0, sz.cx, sz.cy, m); } else w.DrawImage(0, 0, sz.cx, sz.cy, r->GetImage()); // scale up by Draw to give e.g. PDF chance to store unscaled } else - if(IsString(data) && IsSVG(~data)) - w.DrawImage(0, 0, RenderSVGImage(sz, ~data)); + if(IsSVG(s)) + w.DrawImage(0, 0, RenderSVGImage(sz, s)); } Image RichRawImage::ToImage(int64 serial_id, const Value& data, Size sz, void *) const diff --git a/uppsrc/plugin/jpg/jpg.h b/uppsrc/plugin/jpg/jpg.h index 3a80dc344..f9a104979 100644 --- a/uppsrc/plugin/jpg/jpg.h +++ b/uppsrc/plugin/jpg/jpg.h @@ -28,6 +28,8 @@ public: Image GetExifThumbnail(); }; +bool IsJPG(StreamRaster *s); + class JPGEncoder : public StreamRasterEncoder { class Data; One data; diff --git a/uppsrc/plugin/jpg/jpgupp.cpp b/uppsrc/plugin/jpg/jpgupp.cpp index d7dc01f08..8a1ed7945 100644 --- a/uppsrc/plugin/jpg/jpgupp.cpp +++ b/uppsrc/plugin/jpg/jpgupp.cpp @@ -712,9 +712,15 @@ Image JPGRaster::GetExifThumbnail() return StreamRaster::LoadStringAny(ss); } +bool IsJPG(StreamRaster *s) +{ + return dynamic_cast(s); +} + INITIALIZER(JPGRaster) { StreamRaster::Register(); + SetIsJPGFn(IsJPG); } }