diff --git a/uppsrc/CtrlLib/LabelBase.cpp b/uppsrc/CtrlLib/LabelBase.cpp index c502db1d1..2d504a929 100644 --- a/uppsrc/CtrlLib/LabelBase.cpp +++ b/uppsrc/CtrlLib/LabelBase.cpp @@ -63,7 +63,7 @@ Image DisImage(const Image& m) Image DisabledImage(const Image& img, bool dis) { - return dis ? MakeImage(img, GUI_GlobalStyle() == GUISTYLE_CLASSIC ? Etched : DisImage) + return dis ? AdjustImage(img, GUI_GlobalStyle() == GUISTYLE_CLASSIC ? Etched : DisImage) : img; } diff --git a/uppsrc/CtrlLib/SmartText.cpp b/uppsrc/CtrlLib/SmartText.cpp index 0907fa878..df590a909 100644 --- a/uppsrc/CtrlLib/SmartText.cpp +++ b/uppsrc/CtrlLib/SmartText.cpp @@ -126,7 +126,7 @@ void OriDraw::DrawRectOp(int x, int y, int cx, int cy, Color color) void OriDraw::DrawImageOp(int x, int y, int cx, int cy, const Image& img, const Rect& src, Color color) { Transform(x, y, cx, cy); - Image m = MakeImage(img, clockwise ? RotateClockwise : RotateAntiClockwise); + Image m = AdjustImage(img, clockwise ? RotateClockwise : RotateAntiClockwise); ptr->DrawImageOp(x, y, cx, cy, m, Size(cx, cy), color); } diff --git a/uppsrc/Draw/DrawUtil.cpp b/uppsrc/Draw/DrawUtil.cpp index a7fcba4f5..0d2353d7f 100644 --- a/uppsrc/Draw/DrawUtil.cpp +++ b/uppsrc/Draw/DrawUtil.cpp @@ -408,7 +408,7 @@ void DrawHighlightImage(Draw& w, int x, int y, const Image& img, bool highlight, w.DrawImage(x, y + 1, img, maskcolor); w.DrawImage(x, y - 1, img, maskcolor); } - w.DrawImage(x, y, enabled ? img : MakeImage(img, Etched)); + w.DrawImage(x, y, enabled ? img : AdjustImage(img, Etched)); } Color GradientColor(Color fc, Color tc, int i, int n) diff --git a/uppsrc/Draw/ImageOp.h b/uppsrc/Draw/ImageOp.h index 63b6672bf..fe54bba8e 100644 --- a/uppsrc/Draw/ImageOp.h +++ b/uppsrc/Draw/ImageOp.h @@ -170,7 +170,20 @@ void SysImageRealized(const Image& img); // SystemDraw realized Image handle in void SysImageReleased(const Image& img); // SystemDraw dropped Image handle Image MakeImage(const ImageMaker& m); -Image MakeImage(const Image& image, Image (*make)(const Image& image)); + +template +Image MakeImage(T key, M make) { + return MakeValue( + [&] { return key(); }, + [&] (Value& v) { + Image img = make(); + v = img; + return img.GetLength() * sizeof(RGBA); + } + ).template To(); +}; + +Image AdjustImage(const Image& image, Image (*make)(const Image& image)); void SweepMkImageCache(); // deprecated, use AdjustValueCache(); void SetMakeImageCacheMax(int m); // deprecated, use SetupValueCache diff --git a/uppsrc/Draw/MakeCache.cpp b/uppsrc/Draw/MakeCache.cpp index 9c34bda3a..9705b74c6 100644 --- a/uppsrc/Draw/MakeCache.cpp +++ b/uppsrc/Draw/MakeCache.cpp @@ -94,34 +94,12 @@ Image MakeImagePaintOnly(const ImageMaker& m) return MakeImage__(m, true); } -class SimpleImageMaker : public ImageMaker { - Image (*make)(const Image& image); - Image image; - -public: - virtual String Key() const; - virtual Image Make() const; - - SimpleImageMaker(const Image& image, Image (*make)(const Image& image)) - : make(make),image(image) {} -}; - -String SimpleImageMaker::Key() const +Image AdjustImage(const Image& image, Image (*make)(const Image& image)) { - String key; - RawCat(key, image.GetSerialId()); - RawCat(key, make); - return key; -} - -Image SimpleImageMaker::Make() const -{ - return (*make)(image); -} - -Image MakeImage(const Image& image, Image (*make)(const Image& image)) -{ - return MakeImage(SimpleImageMaker(image, make)); + return MakeImage( + [&] { String key; RawCat(key, image.GetSerialId()); RawCat(key, make); return key; }, + [&] { return (*make)(image); } + ); } struct sCachedRescale : public ImageMaker diff --git a/uppsrc/Draw/Uhd.cpp b/uppsrc/Draw/Uhd.cpp index ca9e20bef..4405b83aa 100644 --- a/uppsrc/Draw/Uhd.cpp +++ b/uppsrc/Draw/Uhd.cpp @@ -137,7 +137,7 @@ void SyncUHDMode() Image DPI(const Image& img, int expected) { if(img.GetSize().cy <= expected && IsUHDMode()) - return MakeImage(img, Upscale2x); + return AdjustImage(img, Upscale2x); return img; } diff --git a/uppsrc/Draw/src.tpp/ImageMaker_en-us.tpp b/uppsrc/Draw/src.tpp/ImageMaker_en-us.tpp index 041385f87..494bf259b 100644 --- a/uppsrc/Draw/src.tpp/ImageMaker_en-us.tpp +++ b/uppsrc/Draw/src.tpp/ImageMaker_en-us.tpp @@ -51,13 +51,20 @@ the cache or creates and stores to cache). Images are stored in the U`+`+ global cache.&] [s3;%% &] [s4; &] -[s5;:MakeImage`(const Image`&`,Image`(`*`)`(const Image`&`)`): [_^Image^ Image]_[* MakeIm -age]([@(0.0.255) const]_[_^Image^ Image][@(0.0.255) `&]_[*@3 image], -[_^Image^ Image]_(`*[*@3 make])([@(0.0.255) const]_[_^Image^ Image][@(0.0.255) `&]_[*@3 image -]))&] -[s2;%% Simplified version for Image making process that does not -require other parameters than single input image.&] -[s3;%% &] +[s5;:Upp`:`:MakeImage`(T`,M`): [@(0.0.255) template] <[@(0.0.255) class] +T, [@(0.0.255) class] M> Image [* MakeImage](T [*@3 key], M [*@3 make])&] +[s2;%% Templated version of Image maker `- [%-*@3 key] must be lambda +that returns String that uniquely describes final Image, [%-*@3 make] +must be lambda that returns the final Image.&] +[s3; &] +[s4; &] +[s5;:Upp`:`:AdjustImage`(const Image`&`,Image`(`*`)`(const Image`&`)`): Image +[* AdjustImage]([@(0.0.255) const] Image[@(0.0.255) `&] [*@3 image], +Image ([@(0.0.255) `*]make)([@(0.0.255) const] Image[@(0.0.255) `&]))&] +[s2;%% Simplified version for Image making and caching process that +does not require other parameters than single input image and +function that alters input image to produce the result.&] +[s3; &] [s4; &] [s5;:MakeImagePaintOnly`(const ImageMaker`&`): [_^Image^ Image]_[* MakeImagePaintOnly]([@(0.0.255) c onst]_[_^ImageMaker^ ImageMaker][@(0.0.255) `&]_[*@3 m])&] diff --git a/uppsrc/RichEdit/DiagramMouse.cpp b/uppsrc/RichEdit/DiagramMouse.cpp index 27a297d72..1cacf60d7 100644 --- a/uppsrc/RichEdit/DiagramMouse.cpp +++ b/uppsrc/RichEdit/DiagramMouse.cpp @@ -118,9 +118,9 @@ Image DiagramEditor::CursorImage(Point p, dword keyflags) rot += M_2PI * CursorItem().rotate / 360; - return MakeValue( + return MakeImage( [&] { return String((const char *)&rot, sizeof(rot)); }, - [&] (Value& v) { + [&] { ImagePainter w(DPI(32, 32)); w.Clear(); const double x1 = 10; @@ -144,10 +144,9 @@ Image DiagramEditor::CursorImage(Point p, dword keyflags) w.Stroke(1, Black()); Image img = w.GetResult(); SetHotSpots(img, DPI(16, 16)); - v = img; - return img.GetLength() * sizeof(RGBA); + return img; } - ).To(); + ); } void DiagramEditor::MouseWheel(Point, int zdelta, dword keyflags) { diff --git a/uppsrc/TextDiffCtrl/DirDiff.cpp b/uppsrc/TextDiffCtrl/DirDiff.cpp index d6cfa4973..d7164e388 100644 --- a/uppsrc/TextDiffCtrl/DirDiff.cpp +++ b/uppsrc/TextDiffCtrl/DirDiff.cpp @@ -239,8 +239,8 @@ FileList::File DirDiffDlg::MakeFile(int i) int k = list[i].d; if(IsNull(icn)) icn = CtrlImg::File(); - m.icon = decode(k, FAILED_FILE, MakeImage(icn, [] (const Image& m) { return GetOver(m, DiffImg::Failed()); }), - PATCHED_FILE, MakeImage(icn, [] (const Image& m) { return GetOver(m, DiffImg::Patched()); }), + m.icon = decode(k, FAILED_FILE, AdjustImage(icn, [](const Image& m) { return GetOver(m, DiffImg::Failed()); }), + PATCHED_FILE, AdjustImage(icn, [](const Image& m) { return GetOver(m, DiffImg::Patched()); }), icn); m.name = list[i].a; m.font = decode(k, FAILED_FILE, StdFont().Strikeout().Italic(), diff --git a/uppsrc/ide/UppWspc.cpp b/uppsrc/ide/UppWspc.cpp index 38105ec3d..f04938867 100644 --- a/uppsrc/ide/UppWspc.cpp +++ b/uppsrc/ide/UppWspc.cpp @@ -13,7 +13,7 @@ Image OverLtRed(const Image& m) Image ImageOverRed(const Image& m) { - return MakeImage(m, OverLtRed); + return AdjustImage(m, OverLtRed); } Font WorkspaceWork::ListFont()