Salome HOME
Issue #3041: prevent crash on change sketch plane
[modules/shaper.git] / src / SketcherPrs / SketcherPrs_SymbolPrs.cpp
index 03d1e26f7b65f3a0488c1f5f11287c58192c451c..5f79c5fbaec5d90b5dca3abe513ef441be0c4bf3 100644 (file)
@@ -120,7 +120,7 @@ std::map<const char*, Handle(Image_AlienPixMap)> SketcherPrs_SymbolPrs::myIconsM
 SketcherPrs_SymbolPrs::SketcherPrs_SymbolPrs(ModelAPI_Feature* theConstraint,
   SketchPlugin_Sketch* theSketcher)
  : AIS_InteractiveObject(), myConstraint(theConstraint),
-   myPlane(theSketcher->coordinatePlane()), myIsCustomColor(false),
+   myIsCustomColor(false),
    mySketcher(theSketcher)
 {
   SetAutoHilight(Standard_False);
@@ -168,7 +168,7 @@ Handle(Image_AlienPixMap) SketcherPrs_SymbolPrs::icon()
     aFile = std::string(anEnv) +
       FSEP + "share" + FSEP + "salome" + FSEP + "resources" + FSEP + "shaper";
   } else {
-    anEnv = getenv("OPENPARTS_ROOT_DIR");
+    anEnv = getenv("CADBUILDER_ROOT_DIR");
     if (anEnv)
       aFile = std::string(anEnv) + FSEP + "resources";
   }
@@ -177,6 +177,19 @@ Handle(Image_AlienPixMap) SketcherPrs_SymbolPrs::icon()
   aFile += iconName();
   Handle(Image_AlienPixMap) aPixMap = new Image_AlienPixMap();
   if (aPixMap->Load(aFile.c_str())) {
+    int aRatio = SketcherPrs_Tools::pixelRatio();
+    if (aRatio > 1) {
+      Handle(Image_AlienPixMap) aSizedMap = new Image_AlienPixMap();
+      Standard_Size aWidth = aPixMap->Width() * aRatio;
+      Standard_Size aHeigh = aPixMap->Height() * aRatio;
+      aSizedMap->InitTrash(aPixMap->Format(), aWidth, aHeigh);
+      for (Standard_Size i = 0; i < aWidth; i++) {
+        for (Standard_Size j = 0; j < aHeigh; j++) {
+          aSizedMap->SetPixelColor(i, j, aPixMap->PixelColor(i / aRatio, j / aRatio));
+        }
+      }
+      aPixMap = aSizedMap;
+    }
     myIconsMap[iconName()] = aPixMap;
     return aPixMap;
   }
@@ -261,6 +274,8 @@ void SketcherPrs_SymbolPrs::Compute(
                 const Handle(Prs3d_Presentation)& thePresentation,
                 const Standard_Integer theMode)
 {
+  if (!plane().get())
+    return;
   // Create an icon
   prepareAspect();