View | Details | Raw Unified | Return to issue 122822
Collapse All | Expand All

(-)sc/source/ui/unoobj/chart2uno.cxx (-45 / +27 lines)
Lines 2534-2539 Link Here
2534
2534
2535
            SCCOL nLastCol = -1;
2535
            SCCOL nLastCol = -1;
2536
            SCROW nLastRow = -1;
2536
            SCROW nLastRow = -1;
2537
2538
            SCTAB nTabNum = aRange.aEnd.Tab() >= aRange.aStart.Tab() ?
2539
                aRange.aEnd.Tab() - aRange.aStart.Tab() + 1 : aRange.aStart.Tab() > aRange.aEnd.Tab() + 1;
2540
            SCCOL nColNum = aRange.aEnd.Col() >= aRange.aStart.Col() ?
2541
                aRange.aEnd.Col() - aRange.aStart.Col() + 1 : aRange.aStart.Col() > aRange.aEnd.Col() + 1;
2542
            SCROW nRowNum = aRange.aEnd.Row() >= aRange.aStart.Row() ?
2543
                aRange.aEnd.Row() - aRange.aStart.Row() + 1 : aRange.aStart.Row() > aRange.aEnd.Row() + 1;
2544
            sal_uInt32 nCellNum = nRowNum * nColNum * nTabNum;
2545
            sal_uInt32 nStep = nCellNum >= 20000 ? 5 : 1;
2546
            sal_uInt32 nCount = 0;
2547
2537
            for (SCTAB nTab = aRange.aStart.Tab(); nTab <= aRange.aEnd.Tab(); ++nTab)
2548
            for (SCTAB nTab = aRange.aStart.Tab(); nTab <= aRange.aEnd.Tab(); ++nTab)
2538
            {
2549
            {
2539
                for (SCCOL nCol = aRange.aStart.Col(); nCol <= aRange.aEnd.Col(); ++nCol)
2550
                for (SCCOL nCol = aRange.aStart.Col(); nCol <= aRange.aEnd.Col(); ++nCol)
Lines 2553-2559 Link Here
2553
                                continue;
2564
                                continue;
2554
                        }
2565
                        }
2555
2566
2567
                        if (nCount == nStep)
2568
                            nCount = 0;
2569
                        else if (nCount != 0)
2570
                        {
2571
                            nCount++;
2572
                            continue;
2573
                        }
2574
2556
                        m_aDataArray.push_back(Item());
2575
                        m_aDataArray.push_back(Item());
2576
                        nCount++;
2557
                        Item& rItem = m_aDataArray.back();
2577
                        Item& rItem = m_aDataArray.back();
2558
                        ++nDataCount;
2578
                        ++nDataCount;
2559
    
2579
    
Lines 2563-2568 Link Here
2563
                            continue;
2583
                            continue;
2564
    
2584
    
2565
                        if (pCell->HasStringData())
2585
                        if (pCell->HasStringData())
2586
2566
                            rItem.maString = pCell->GetStringData();
2587
                            rItem.maString = pCell->GetStringData();
2567
                        else
2588
                        else
2568
                        {    
2589
                        {    
Lines 3018-3068 Link Here
3018
    ::rtl::math::setNan(&fNAN);
3039
    ::rtl::math::setNan(&fNAN);
3019
3040
3020
    sal_Int32 nCount = m_aDataArray.size();
3041
    sal_Int32 nCount = m_aDataArray.size();
3021
    // i121058: if there's too many points need to be painted, it doens't need to get all points for performance consideration
3042
    uno::Sequence<double> aSeq(nCount);
3022
    // and so many points are not useful for users to understand the chart. So only picked some points to paint
3043
     double* pArr = aSeq.getArray();
3023
    sal_Int32 nStep = nCount >= 10000 ? 50 : 1;
3044
     ::std::list<Item>::const_iterator itr = m_aDataArray.begin(), itrEnd = m_aDataArray.end();
3024
    nCount = nCount >= 10000 ? ((nCount - nCount % nStep) / nStep) : nCount;
3045
    for (; itr != itrEnd; ++itr, ++pArr)
3025
    sal_Int32 nRealCount = nStep == 1 ? nCount : nCount * 2;
3046
        *pArr = itr->mbIsValue ? itr->mfValue : fNAN;
3026
    uno::Sequence<double> aSeq(nRealCount);
3047
3027
    double* pArr = aSeq.getArray();
3028
    ::std::list<Item>::const_iterator itr = m_aDataArray.begin(), itrEnd = m_aDataArray.end();
3029
    for (sal_Int32 i = 0; i < nCount; i++)
3030
    {
3031
        if (nStep == 1)
3032
        {
3033
            *pArr++ = itr->mbIsValue ? itr->mfValue : fNAN;
3034
            itr++;
3035
        }
3036
        else
3037
        {
3038
            sal_Int32 nMax = 0, nMin = 0, nMaxStep = 0, nMinStep = 0;
3039
            for (sal_Int32 j = 0; j < nStep; j++)
3040
            {
3041
                sal_Int32 nValue = itr->mbIsValue ? itr->mfValue : fNAN;
3042
                if (nValue > nMax)
3043
                {
3044
                    nMax = nValue;
3045
                    nMaxStep = j;
3046
                }
3047
                if (nValue < nMin)
3048
                {
3049
                    nMin = nValue;
3050
                    nMinStep = j;
3051
                }
3052
                itr++;
3053
            }
3054
            if (nMaxStep > nMinStep)
3055
            {
3056
                *pArr++ = nMin;
3057
                *pArr++ = nMax;
3058
            }
3059
            else
3060
            {
3061
                *pArr++ = nMax;
3062
                *pArr++ = nMin;
3063
            }
3064
        }
3065
    }
3066
    return aSeq;
3048
    return aSeq;
3067
}
3049
}
3068
3050

Return to issue 122822