#include "ImageMT.h" ImageMT::ImageMT() { CtrlLayout(*this, "Window title"); buttonLoad <<= THISBACK(LoadImage); m_fPower.SetData(2.3); buttonSquare <<= THISBACK(Square); } ImageMT::~ImageMT() { for(int i=0;i r = StreamRaster::OpenAny(in); if(!r) { String s = Format("Error opening streamraster file %s",path); PromptOK(s); return; } Layer* pLayer = new Layer; Size sz = GetSize(); pLayer->m_img = r->GetImage(); pLayer->m_rc.left = 0; pLayer->m_rc.right = 1; pLayer->m_rc.top = 0; pLayer->m_rc.bottom = 1; m_pLayers.Add(pLayer); } void ImageMT::Paint(Draw& w) { Size sz = GetSize(); if(m_pLayers.GetCount()<=0) w.DrawRect(sz,SWhite); for(int i=0;im_rc.left * sz.cx; rc.right = m_pLayers[i]->m_rc.right * sz.cx; rc.top = m_pLayers[i]->m_rc.top * sz.cy; rc.bottom = m_pLayers[i]->m_rc.bottom * sz.cy; w.DrawImage(rc,m_pLayers[i]->m_img); } } void ImageMT::Square() { if(m_pLayers.GetCount()<=0) return; Layer* pLayer = m_pLayers[0]; double f = m_fPower.GetData(); AtomicInc(threads); Thread().Run(callback4(&Layer::MakeLayerAsThread,pLayer,f,this,0)); } Layer::Layer(Layer* pLayer,double op,void* pMain) { Size szi = pLayer->m_img.GetSize(); ImageMT* ptr = (ImageMT*)pMain; Size sz = ptr->GetSize(); ImageBuffer ib(szi); PostCallback(callback1(ptr,&ImageMT::StartProg,szi.cy)); for(int i=0;im_img[i]; const RGBA* pOrg = pLayer->GetImage(i); RGBA* pNew = ib[i]; for(int j=0;jAddLayer(pNewLayer); ptr->Refresh(); AtomicDec(ptr->threads); // the last thing this thread does is clean up } GUI_APP_MAIN { ImageMT().Sizeable().Zoomable().Run(); }