//---------------------------------------------------------------------------------------------------- void UIDialogController::run (UTF8StringPtr _templateName, UTF8StringPtr _dialogTitle, UTF8StringPtr _button1, UTF8StringPtr _button2, IController* _dialogController, UIDescription* _description) { collectOpenGLViews (frame); templateName = _templateName; dialogTitle = _dialogTitle; dialogButton1 = _button1; dialogButton2 = _button2 != 0 ? _button2 : ""; dialogController = dynamic_cast<CBaseObject*> (_dialogController); dialogDescription = _description; CView* view = UIEditController::getEditorDescription ().createView ("dialog", this); if (view) { CRect size = view->getViewSize (); size.right += sizeDiff.x; size.bottom += sizeDiff.y; CRect frameSize = frame->getViewSize (); size.centerInside (frameSize); size.makeIntegral (); view->setViewSize (size); view->setMouseableArea (size); frame->setModalView (view); frame->registerKeyboardHook (this); if (button1) frame->setFocusView (button1); setOpenGLViewsVisible (false); dialogController->notify (this, kMsgDialogShow); } else { forget (); } }
//----------------------------------------------------------------------------- void D2DDrawContext::drawRect (const CRect &_rect, const CDrawStyle drawStyle) { if (renderTarget) { CRect rect (_rect); rect.offset (currentState.offset.x, currentState.offset.y); rect.normalize (); if (currentState.drawMode.integralMode ()) { rect.makeIntegral (); } D2DApplyClip clip (this); if (drawStyle == kDrawFilled || drawStyle == kDrawFilledAndStroked) { renderTarget->FillRectangle (makeD2DRect (rect), fillBrush); } if (drawStyle == kDrawStroked || drawStyle == kDrawFilledAndStroked) { rect.left++; rect.bottom--; if ((((int32_t)currentState.frameWidth) % 2)) renderTarget->SetTransform (D2D1::Matrix3x2F::Translation (0.f, 0.5f)); renderTarget->DrawRectangle (makeD2DRect (rect), strokeBrush, (FLOAT)currentState.frameWidth, strokeStyle); renderTarget->SetTransform (D2D1::Matrix3x2F::Identity ()); } } }
//----------------------------------------------------------------------------- D2DDrawContext::D2DApplyClip::D2DApplyClip (D2DDrawContext* drawContext, bool halfPointOffset) : drawContext (drawContext) { if (drawContext->currentClip != drawContext->currentState.clipRect) { CRect clip = drawContext->currentState.clipRect; if (drawContext->getDrawMode ().integralMode ()) clip.makeIntegral (); if (drawContext->currentClip.isEmpty () == false) drawContext->getRenderTarget ()->PopAxisAlignedClip (); if (clip.isEmpty () == false) drawContext->getRenderTarget ()->PushAxisAlignedClip (makeD2DRect (clip), D2D1_ANTIALIAS_MODE_PER_PRIMITIVE); drawContext->currentClip = applyClip = clip; } else { applyClip = drawContext->currentClip; } if (drawContext->getCurrentTransform ().isInvariant () == false) { CGraphicsTransform transform = drawContext->getCurrentTransform (); if (halfPointOffset) transform.translate (0.5, 0.5); drawContext->getRenderTarget ()->SetTransform (convert (transform)); } else if (halfPointOffset) drawContext->getRenderTarget ()->SetTransform (D2D1::Matrix3x2F::Translation (0.5f, 0.5f)); }
//----------------------------------------------------------------------------- void CGDrawContext::drawBitmap (CBitmap* bitmap, const CRect& inRect, const CPoint& inOffset, float alpha) { if (bitmap == 0 || alpha == 0.f) return; CGBitmap* cgBitmap = bitmap->getPlatformBitmap () ? dynamic_cast<CGBitmap*> (bitmap->getPlatformBitmap ()) : 0; CGImageRef image = cgBitmap ? cgBitmap->getCGImage () : 0; if (image) { CGContextRef context = beginCGContext (false, true); if (context) { CRect rect (inRect); rect.makeIntegral (); CPoint offset (inOffset); offset.makeIntegral (); CGContextSetAlpha (context, (CGFloat)alpha*currentState.globalAlpha); CGRect dest; dest.origin.x = rect.left - offset.h; dest.origin.y = -(rect.top) - (bitmap->getHeight () - offset.v); dest.size.width = cgBitmap->getSize ().x; dest.size.height = cgBitmap->getSize ().y; CGRect clipRect2; clipRect2.origin.x = rect.left; clipRect2.origin.y = -(rect.top) - rect.height (); clipRect2.size.width = rect.width (); clipRect2.size.height = rect.height (); CGContextClipToRect (context, clipRect2); CGLayerRef layer = cgBitmap->getCGLayer (); if (layer == 0) { BitmapDrawCountMap::iterator it = bitmapDrawCount.find (cgBitmap); if (it == bitmapDrawCount.end ()) { bitmapDrawCount.insert (std::pair<CGBitmap*, int32_t> (cgBitmap, 1)); CGContextDrawImage (context, dest, image); } else { it->second++; layer = cgBitmap->createCGLayer (context); } } if (layer) { CGContextDrawLayerInRect (context, dest, layer); } releaseCGContext (context); } } }
//---------------------------------------------------------------------------------------------------- void UIDialogController::run (UTF8StringPtr _templateName, UTF8StringPtr _dialogTitle, UTF8StringPtr _button1, UTF8StringPtr _button2, IController* _dialogController, UIDescription* _description) { collectOpenGLViews (frame); templateName = _templateName; dialogTitle = _dialogTitle; dialogButton1 = _button1; dialogButton2 = _button2 != 0 ? _button2 : ""; dialogController = dynamic_cast<CBaseObject*> (_dialogController); dialogDescription = _description; CView* view = UIEditController::getEditorDescription ().createView ("dialog", this); if (view) { CLayeredViewContainer* layeredView = dynamic_cast<CLayeredViewContainer*>(view); if (layeredView) layeredView->setZIndex (10); CRect size = view->getViewSize (); size.right += sizeDiff.x; size.bottom += sizeDiff.y; CRect frameSize = frame->getViewSize (); size.centerInside (frameSize); size.makeIntegral (); view->setViewSize (size); view->setMouseableArea (size); view->setAlphaValue (0.f); frame->setModalView (view); frame->registerKeyboardHook (this); frame->registerViewListener (this); view->registerViewListener (this); if (button1) frame->setFocusView (button1); setOpenGLViewsVisible (false); if (dialogController) dialogController->notify (this, kMsgDialogShow); view->addAnimation ("AlphaAnimation", new Animation::AlphaValueAnimation (1.f), new Animation::LinearTimingFunction (160)); } else { forget (); } }
//----------------------------------------------------------------------------- void D2DDrawContext::drawBitmap (CBitmap* bitmap, const CRect& dest, const CPoint& offset, float alpha) { if (renderTarget == 0) return; D2DApplyClip ac (this); if (ac.isEmpty ()) return; double transformedScaleFactor = getScaleFactor (); CGraphicsTransform t = getCurrentTransform (); if (t.m11 == t.m22 && t.m12 == 0 && t.m21 == 0) transformedScaleFactor *= t.m11; IPlatformBitmap* platformBitmap = bitmap->getBestPlatformBitmapForScaleFactor (transformedScaleFactor); D2DBitmap* d2dBitmap = platformBitmap ? dynamic_cast<D2DBitmap*> (platformBitmap) : 0; if (d2dBitmap) { if (d2dBitmap->getSource ()) { ID2D1Bitmap* d2d1Bitmap = D2DBitmapCache::instance ()->getBitmap (d2dBitmap, renderTarget); if (d2d1Bitmap) { double bitmapScaleFactor = platformBitmap->getScaleFactor (); CGraphicsTransform bitmapTransform; bitmapTransform.scale (bitmapScaleFactor, bitmapScaleFactor); Transform transform (*this, bitmapTransform.inverse ()); CRect d (dest); d.makeIntegral (); CRect source (dest); source.offset (-source.left, -source.top); source.offset (offset.x, offset.y); bitmapTransform.transform (source); D2D1_RECT_F sourceRect = makeD2DRect (source); renderTarget->DrawBitmap (d2d1Bitmap, makeD2DRect (d), alpha * currentState.globalAlpha, D2D1_BITMAP_INTERPOLATION_MODE_LINEAR, &sourceRect); } } } }
//----------------------------------------------------------------------------- void D2DDrawContext::drawBitmap (CBitmap* bitmap, const CRect& dest, const CPoint& offset, float alpha) { D2DBitmap* d2dBitmap = bitmap->getPlatformBitmap () ? dynamic_cast<D2DBitmap*> (bitmap->getPlatformBitmap ()) : 0; if (renderTarget && d2dBitmap) { if (d2dBitmap->getSource ()) { ID2D1Bitmap* d2d1Bitmap = D2DBitmapCache::instance ()->getBitmap (d2dBitmap, renderTarget); if (d2d1Bitmap) { D2DApplyClip clip (this); CRect d (dest); d.offset (currentState.offset.x, currentState.offset.y); d.makeIntegral (); CRect source (dest); source.offset (-source.left, -source.top); source.offset (offset.x, offset.y); D2D1_RECT_F sourceRect = makeD2DRect (source); renderTarget->DrawBitmap (d2d1Bitmap, makeD2DRect (d), alpha * currentState.globalAlpha, D2D1_BITMAP_INTERPOLATION_MODE_LINEAR, &sourceRect); } } } }
//------------------------------------------------------------------------ void CCheckBox::draw (CDrawContext* context) { float norm = getValueNormalized (); CRect checkBoxSize (getViewSize ()); if (getDrawBackground ()) { CPoint off; checkBoxSize.setWidth (getDrawBackground ()->getWidth ()); checkBoxSize.setHeight (getDrawBackground ()->getHeight () / 6); if (norm == 0.5) off.y = checkBoxSize.getHeight (); else if (norm > 0.5) off.y = checkBoxSize.getHeight () * 2; else off.y = 0; if (hilight) off.y += getDrawBackground ()->getHeight () / 2; getDrawBackground ()->draw (context, checkBoxSize, off); } else { checkBoxSize.setHeight (getFontCapHeight (font) + 2); checkBoxSize.setWidth (checkBoxSize.getHeight ()); checkBoxSize.offset (1, ceil ((getViewSize ().getHeight () - checkBoxSize.getHeight ()) / 2)); checkBoxSize.makeIntegral (); context->setLineWidth (1); context->setLineStyle (kLineSolid); context->setDrawMode (kAliasing); context->setFrameColor (boxFrameColor); context->setFillColor (boxFillColor); context->drawRect (checkBoxSize, kDrawFilledAndStroked); if (hilight) { CColor hilightColor = boxFrameColor; hilightColor.alpha /= 2; context->setFrameColor (hilightColor); CRect r (checkBoxSize); r.inset (1, 1); context->drawRect (r, kDrawStroked); } context->setDrawMode (kAntiAliasing); context->setFrameColor (checkMarkColor); context->setLineWidth (2); const CCoord cbInset = 2; if (style & kDrawCrossBox) { if (norm == 0.5f) { context->moveTo (CPoint (checkBoxSize.left + cbInset, checkBoxSize.top + checkBoxSize.getHeight () / 2)); context->lineTo (CPoint (checkBoxSize.right - cbInset, checkBoxSize.top + checkBoxSize.getHeight () / 2)); } else if (norm > 0.5f) { context->moveTo (CPoint (checkBoxSize.left + cbInset, checkBoxSize.top + cbInset)); context->lineTo (CPoint (checkBoxSize.right - cbInset, checkBoxSize.bottom - cbInset)); context->moveTo (CPoint (checkBoxSize.left + cbInset, checkBoxSize.bottom - cbInset)); context->lineTo (CPoint (checkBoxSize.right - cbInset, checkBoxSize.top + cbInset)); } } else { context->moveTo (CPoint (checkBoxSize.left + cbInset, checkBoxSize.top + checkBoxSize.getHeight () / 2)); if (norm == 0.5f) { context->lineTo (CPoint (checkBoxSize.right - cbInset, checkBoxSize.top + checkBoxSize.getHeight () / 2)); } else if (norm > 0.5f) { context->lineTo (CPoint (checkBoxSize.left + checkBoxSize.getWidth () / 2, checkBoxSize.bottom - cbInset)); context->lineTo (CPoint (checkBoxSize.right + 1, checkBoxSize.top - 1)); } } } if (title) { CPoint p (checkBoxSize.getBottomRight ()); p.offset (kCheckBoxTitleMargin, -1); context->setFont (font); context->setFontColor (fontColor); context->drawString (title, p, true); } setDirty (false); }