void TextGrid_Pitch_draw (TextGrid grid, Pitch pitch, Graphics g, long tierNumber, double tmin, double tmax, double fmin, double fmax, double fontSize, int useTextStyles, int horizontalAlignment, int garnish, int speckle, int unit) { try { TextGrid_checkSpecifiedTierNumberWithinRange (grid, tierNumber); double oldFontSize = Graphics_inqFontSize (g); Pitch_draw (pitch, g, tmin, tmax, fmin, fmax, garnish, speckle, unit); if (tmax <= tmin) tmin = grid -> xmin, tmax = grid -> xmax; autoPitchTier pitchTier = Pitch_to_PitchTier (pitch); if (Function_isUnitLogarithmic (pitch, Pitch_LEVEL_FREQUENCY, unit)) { fmin = Function_convertStandardToSpecialUnit (pitch, fmin, Pitch_LEVEL_FREQUENCY, unit); fmax = Function_convertStandardToSpecialUnit (pitch, fmax, Pitch_LEVEL_FREQUENCY, unit); } Graphics_setTextAlignment (g, horizontalAlignment, Graphics_BOTTOM); Graphics_setInner (g); Graphics_setFontSize (g, fontSize); Graphics_setPercentSignIsItalic (g, useTextStyles); Graphics_setNumberSignIsBold (g, useTextStyles); Graphics_setCircumflexIsSuperscript (g, useTextStyles); Graphics_setUnderscoreIsSubscript (g, useTextStyles); Function anyTier = (Function) grid -> tiers -> item [tierNumber]; if (anyTier -> classInfo == classIntervalTier) { IntervalTier tier = (IntervalTier) anyTier; for (long i = 1; i <= tier -> intervals -> size; i ++) { TextInterval interval = (TextInterval) tier -> intervals -> item [i]; double tleft = interval -> xmin, tright = interval -> xmax, tmid, f0; if (! interval -> text || ! interval -> text [0]) continue; if (tleft < pitch -> xmin) tleft = pitch -> xmin; if (tright > pitch -> xmax) tright = pitch -> xmax; tmid = (tleft + tright) / 2; if (tmid < tmin || tmid > tmax) continue; f0 = Function_convertStandardToSpecialUnit (pitch, RealTier_getValueAtTime (pitchTier.peek(), tmid), Pitch_LEVEL_FREQUENCY, unit); if (f0 < fmin || f0 > fmax) continue; Graphics_text (g, horizontalAlignment == Graphics_LEFT ? tleft : horizontalAlignment == Graphics_RIGHT ? tright : tmid, f0, interval -> text); } } else { TextTier tier = (TextTier) anyTier; for (long i = 1; i <= tier -> points -> size; i ++) { TextPoint point = (TextPoint) tier -> points -> item [i]; double t = point -> number, f0; if (! point -> mark || ! point -> mark [0]) continue; if (t < tmin || t > tmax) continue; f0 = Function_convertStandardToSpecialUnit (pitch, RealTier_getValueAtTime (pitchTier.peek(), t), Pitch_LEVEL_FREQUENCY, unit); if (f0 < fmin || f0 > fmax) continue; Graphics_text (g, t, f0, point -> mark); } } Graphics_setPercentSignIsItalic (g, TRUE); Graphics_setNumberSignIsBold (g, TRUE); Graphics_setCircumflexIsSuperscript (g, TRUE); Graphics_setUnderscoreIsSubscript (g, TRUE); Graphics_setFontSize (g, oldFontSize); Graphics_unsetInner (g); } catch (MelderError) { Melder_throw (grid, " & ", pitch, ": not drawn."); } }
void structTableEditor :: v_draw () { Table table = static_cast<Table> (data); double spacing = 2.0; // millimetres at both edges double columnWidth, cellWidth; /* * We fit 200 rows in 40 inches, which is 14.4 points per row. */ long rowmin = topRow, rowmax = rowmin + 197; long colmin = leftColumn, colmax = colmin + (kTableEditor_MAXNUM_VISIBLE_COLUMNS - 1); if (rowmax > table -> rows.size) rowmax = table -> rows.size; if (colmax > table -> numberOfColumns) colmax = table -> numberOfColumns; Graphics_clearWs (graphics.get()); Graphics_setTextAlignment (graphics.get(), Graphics_CENTRE, Graphics_HALF); Graphics_setWindow (graphics.get(), 0.0, 1.0, rowmin + 197.5, rowmin - 2.5); Graphics_setColour (graphics.get(), Graphics_SILVER); Graphics_fillRectangle (graphics.get(), 0.0, 1.0, rowmin - 2.5, rowmin - 0.5); Graphics_setColour (graphics.get(), Graphics_BLACK); Graphics_line (graphics.get(), 0.0, rowmin - 0.5, 1.0, rowmin - 0.5); Graphics_setWindow (graphics.get(), 0.0, Graphics_dxWCtoMM (graphics.get(), 1.0), rowmin + 197.5, rowmin - 2.5); /* * Determine the width of the column with the row numbers. */ columnWidth = Graphics_textWidth (graphics.get(), U"row"); for (long irow = rowmin; irow <= rowmax; irow ++) { cellWidth = Graphics_textWidth (graphics.get(), Melder_integer (irow)); if (cellWidth > columnWidth) columnWidth = cellWidth; } columnLeft [0] = columnWidth + 2 * spacing; Graphics_setColour (graphics.get(), Graphics_SILVER); Graphics_fillRectangle (graphics.get(), 0.0, columnLeft [0], rowmin - 0.5, rowmin + 197.5); Graphics_setColour (graphics.get(), Graphics_BLACK); Graphics_line (graphics.get(), columnLeft [0], rowmin - 0.5, columnLeft [0], rowmin + 197.5); /* * Determine the width of the columns. */ for (long icol = colmin; icol <= colmax; icol ++) { const char32 *columnLabel = table -> columnHeaders [icol]. label; columnWidth = Graphics_textWidth (graphics.get(), Melder_integer (icol)); if (! columnLabel) columnLabel = U""; cellWidth = Graphics_textWidth (graphics.get(), columnLabel); if (cellWidth > columnWidth) columnWidth = cellWidth; for (long irow = rowmin; irow <= rowmax; irow ++) { const char32 *cell = Table_getStringValue_Assert (table, irow, icol); Melder_assert (cell); if (cell [0] == U'\0') cell = U"?"; cellWidth = Graphics_textWidth (graphics.get(), cell); if (cellWidth > columnWidth) columnWidth = cellWidth; } columnRight [icol - colmin] = columnLeft [icol - colmin] + columnWidth + 2 * spacing; if (icol < colmax) columnLeft [icol - colmin + 1] = columnRight [icol - colmin]; } /* Text can be "graphic" or not. */ Graphics_setPercentSignIsItalic (our graphics.get(), our p_useTextStyles); Graphics_setNumberSignIsBold (our graphics.get(), our p_useTextStyles); Graphics_setCircumflexIsSuperscript (our graphics.get(), our p_useTextStyles); Graphics_setUnderscoreIsSubscript (our graphics.get(), our p_useTextStyles); /* * Show the row numbers. */ Graphics_text (graphics.get(), columnLeft [0] / 2, rowmin - 1, U"row"); for (long irow = rowmin; irow <= rowmax; irow ++) { Graphics_text (graphics.get(), columnLeft [0] / 2, irow, irow); } /* * Show the column labels. */ for (long icol = colmin; icol <= colmax; icol ++) { double mid = (columnLeft [icol - colmin] + columnRight [icol - colmin]) / 2; const char32 *columnLabel = table -> columnHeaders [icol]. label; if (! columnLabel || columnLabel [0] == U'\0') columnLabel = U"?"; Graphics_text (graphics.get(), mid, rowmin - 2, icol); Graphics_text (graphics.get(), mid, rowmin - 1, columnLabel); } /* * Show the cell contents. */ for (long irow = rowmin; irow <= rowmax; irow ++) { for (long icol = colmin; icol <= colmax; icol ++) { double mid = (columnLeft [icol - colmin] + columnRight [icol - colmin]) / 2; const char32 *cell = Table_getStringValue_Assert (table, irow, icol); Melder_assert (cell); if (cell [0] == U'\0') cell = U"?"; Graphics_text (graphics.get(), mid, irow, cell); } } }
void TextGrid_Sound_draw (TextGrid me, Sound sound, Graphics g, double tmin, double tmax, int showBoundaries, int useTextStyles, int garnish) // STEREO BUG { long numberOfTiers = my tiers -> size; /* * Automatic windowing: */ if (tmax <= tmin) tmin = my xmin, tmax = my xmax; Graphics_setInner (g); Graphics_setWindow (g, tmin, tmax, -1.0 - 0.5 * numberOfTiers, 1.0); /* * Draw sound in upper part. */ long first, last; if (sound && Sampled_getWindowSamples (sound, tmin, tmax, & first, & last) > 1) { Graphics_setLineType (g, Graphics_DOTTED); Graphics_line (g, tmin, 0.0, tmax, 0.0); Graphics_setLineType (g, Graphics_DRAWN); Graphics_function (g, sound -> z [1], first, last, Sampled_indexToX (sound, first), Sampled_indexToX (sound, last)); } /* * Draw labels in lower part. */ Graphics_setTextAlignment (g, Graphics_CENTRE, Graphics_HALF); Graphics_setPercentSignIsItalic (g, useTextStyles); Graphics_setNumberSignIsBold (g, useTextStyles); Graphics_setCircumflexIsSuperscript (g, useTextStyles); Graphics_setUnderscoreIsSubscript (g, useTextStyles); for (long itier = 1; itier <= numberOfTiers; itier ++) { Function anyTier = (Function) my tiers -> item [itier]; double ymin = -1.0 - 0.5 * itier, ymax = ymin + 0.5; Graphics_rectangle (g, tmin, tmax, ymin, ymax); if (anyTier -> classInfo == classIntervalTier) { IntervalTier tier = (IntervalTier) anyTier; long ninterval = tier -> intervals -> size; for (long iinterval = 1; iinterval <= ninterval; iinterval ++) { TextInterval interval = (TextInterval) tier -> intervals -> item [iinterval]; double intmin = interval -> xmin, intmax = interval -> xmax; if (intmin < tmin) intmin = tmin; if (intmax > tmax) intmax = tmax; if (intmin >= intmax) continue; if (showBoundaries && intmin > tmin && intmin < tmax) { Graphics_setLineType (g, Graphics_DOTTED); Graphics_line (g, intmin, -1.0, intmin, 1.0); /* In sound part. */ Graphics_setLineType (g, Graphics_DRAWN); } /* Draw left boundary. */ if (intmin > tmin && intmin < tmax) Graphics_line (g, intmin, ymin, intmin, ymax); /* Draw label text. */ if (interval -> text && intmax >= tmin && intmin <= tmax) { double t1 = tmin > intmin ? tmin : intmin; double t2 = tmax < intmax ? tmax : intmax; Graphics_text (g, 0.5 * (t1 + t2), 0.5 * (ymin + ymax), interval -> text); } } } else { TextTier tier = (TextTier) anyTier; long numberOfPoints = tier -> points -> size; for (long ipoint = 1; ipoint <= numberOfPoints; ipoint ++) { TextPoint point = (TextPoint) tier -> points -> item [ipoint]; double t = point -> number; if (t > tmin && t < tmax) { if (showBoundaries) { Graphics_setLineType (g, Graphics_DOTTED); Graphics_line (g, t, -1.0, t, 1.0); /* In sound part. */ Graphics_setLineType (g, Graphics_DRAWN); } Graphics_line (g, t, ymin, t, 0.8 * ymin + 0.2 * ymax); Graphics_line (g, t, 0.2 * ymin + 0.8 * ymax, t, ymax); if (point -> mark) Graphics_text (g, t, 0.5 * (ymin + ymax), point -> mark); } } } } Graphics_setPercentSignIsItalic (g, TRUE); Graphics_setNumberSignIsBold (g, TRUE); Graphics_setCircumflexIsSuperscript (g, TRUE); Graphics_setUnderscoreIsSubscript (g, TRUE); Graphics_unsetInner (g); if (garnish) { Graphics_drawInnerBox (g); Graphics_textBottom (g, 1, L"Time (s)"); Graphics_marksBottom (g, 2, 1, 1, 1); } }